Angularjs的四大特性

四大特性

  • 使用MVC設計模式
  • 雙向數據綁定
  • 依賴注入
  • 采用模塊化設計
一、控制器的作用域
  • 每次調用ng-controller都會創建一個新的Controller對象
  • 每個Controller對象都有唯一的$scope對象,表示當前控制器對象的有效范圍/作用域
  • 聲明在某個$scope中的模型數據,一般情況下不能被其他的控制器所使用
  • 若想在多個控制器間共享數據、傳遞數據,可以聲明在根作用域--$rootScope--每個Angular應用只有一個唯一的$rootScape對象
  • 控制器的本質用途:用于劃分一個大型頁面中的不同的DIV塊- 每個塊中都有自己專用的數據,以及可以跟其他塊共享的數據
二、雙向數據綁定
  • 方向1 Model綁定到view,此后不論何時只要Model發生改變,數據會立即自動同步更新
    實現方法:{{}} ng-bind ng-if ng-Repeat 幾乎所有的顯示數據的指令都實現了方向1的綁定
    實例:
    1.創建一個點擊計數器,有一個按鈕,只要點擊一次,立即顯示出點擊次數
    2.輪播圖的前進后退按鈕
<--html代碼--!>
<body ng-app="myModule">
        <div class="container"  ng-controller="myControl">
            <button class="btn btn-danger" ng-click="add()">有種點我啊</button>
            <br />
            點擊次數:<span>{{count}}</span>
            <h1>輪播圖</h1>
            ![]({{'images/color'+index+'.png'}})
            <button class="btn btn-success" ng-click="pre()">上一張</button>
            <button class="btn btn-warnning" ng-click="next()">下一張</button>
        </div>
    </body>
//js代碼部分
<script type="text/javascript">
        angular.module("myModule",["ng"]).controller("myControl",function  ($scope){
            var count=0;
            $scope.count=count;
            $scope.add=function() {
                $scope.count++;
            }
            var index=1;
            $scope.index=index;
            $scope.pre=function() {
                    $scope.index--;
                    if($scope.index==0){
                        $scope.index=9;
                    }
                }
            $scope.next=function() {
                $scope.index++;
                if($scope.index==10){
                        $scope.index=1;
                    }
            }
        });
    </script>
計數器和輪播圖
  • 方向2 view綁定到model,把視圖中可以修改的HTML元素,即表單控件的值綁定到模型變量上。此后,只要用戶修改了表單控件的值后,后臺模型變量的值會立即隨之改變
    實現: 只有ngmodel指令可以,為了監視到Model變量真的被改變了可以使用$scope.$watch()函數對Model數據的值進行監視,
    實例:將用戶名和密碼實時顯示出來,復選框顯示婚否,單選框顯示當前選擇的性別,下拉框顯示選擇的城市,簡易版購物車計算器計算實時總價
<body ng-app="myModule" >
            <div class="container" ng-controller="myControl">
                <h1>單行文本輸入框</h1>
                名字:<input type="text" ng-model="name"/>
                <span>{{name}}</span><br />
                密碼:<input type="password" ng-model="password"/>
                <span>{{password}}</span>
                <br />
                <h2>復選框</h2><br />
                婚否:<input type="checkbox"  ng-model="marry"/><span>{{marry}}</span><br />
                <h2>單選框</h2><br />
                <input type="radio" value="男" ng-model="sex"/>男
                <input type="radio" value="女" ng-model="sex"/>女
                <span>{{sex}}</span><br />
                
                <h2>下拉框</h2>
                <select name="" ng-model="city">
                    <option value="北京">北京</option>
                    <option value="上海">上海</option>
                    <option value="深圳">深圳</option>
                    <option value="廣州">廣州</option>
                </select>
                <span>{{city}}</span>
                <br />
                
                <h2>簡易版購物車計算器</h2>
                單價:<input type="text" ng-model="price" />
                數量:<input type="text" ng-model="number" />
                總價:{{price*number}}
            </div>
        </body>
angular.module("myModule",["ng"]).controller("myControl",function  ($scope){
            $scope.$watch("name+password",function() {  //兩個監聽對象之間用+連接即可
                console.log($scope.name);
                console.log($scope.password);
            })
        })
三、依賴注入

被動注入方式(Injection)方式
angular.module("myModule",["ng]).controller("myControl",function($scope,$interval));
angular中的ngController指令在實例化控制器對象時,會根據指令的形參名,創建出控制器所依賴的對象,并注入進來---依賴注入(Dependency Injection)
注意:

  • angular在創建控制器對象時,會根據形參列表中的每個形參依賴的對象的名稱來創建,故控制器聲明函數不能聲明angular無法識別的形參名 angular只提供了一種依賴注入方式-根據形參名來注入依賴的對象
  • 若項目js文件使用了類似yuicompressor等壓縮程序,默認會把函數的形參名精簡為一個字母的形式,會導致Angular的依賴注入失敗
    解決辦法
 module.controller("控制器名",[
                 
                  "$scope",
                  "$interval",
                  "$http",
                  function(a,b,c){

                  }
              ]);
  • 可以被注入的對象-所有的service對象都可以被注入
    • $rootScope 在多個控制器間共享數據的服務
    • $interval 提供周期性定時器服務
    • $timeout 提供一次性定時器服務
    • $log 體用五個基本的日志輸出服務
    • $http 提供異步HTPP請求(AJAX)的服務
      $http{method:"GET",url:""}.then(fun).catch(fun)
      
         $http.get("url").then(fn);
      
         $http.post("url",data).then(fn);
      
  - $location
實例:使用定時器interval實現秒鐘

<body ng-app="myModule">
<div class="container" ng-controller="myControl">
<p>{{num}}</p>
</div>
</body>

<script>
angular.module("myModule",["ng"]).controller("myControl",function($interval){
$scope.num=0;
$interval(function(){
$scope.num++;
},1000);
</script>

#####ng模塊中提供的過濾器

  1. filter:把model中的數據在顯示時以某種特定的格式來呈現

    1. lowercase

      語法:{{表達式 | lowercase}

    2. uppercase

      語法:{{表達式 | uppercase}

    3. number

      語法:{{表達式 | number}}
      {{表達式 | number:小數位數}}

    4. currency

      {{表達式 | currency}}
      {{表達式 | currency:'貨幣符號'}}

    5. date

      {{表達式 | date }}
      {{表達式 | date | "yyyy-MM-dd"}}

#####四、單頁應用
angularjs提供的模塊---ngroute
1)概念:
route:路由,通過某條線路找到目標內容
ngroute:模塊的目標,就是根據瀏覽器url中的一個特殊的地址標記,查到到該標記所對應的模板頁面,并異步加載到ng-view上
2)使用步驟:
 1) 創建唯一完整的HTML頁面,其中聲明一個容器,ngview指令。引入angular.js angular-routejs

     <div ng-view></div>

 2)創建多個模板頁面(習慣上放在一個特別的目錄下,如tpl)

 3) 創建Module,聲明依賴于ng/ng-route兩個模板

     var app = angular.module("module",["ng","ngRoute"]);

 4)在Module中配置路由字典

     app.config(function($routeProvider){

      $routeProvider.when("/start",{


         templateUrl:xxx,
         controller:""     //此處聲明的控制器可供當前目標頁面所有元素使用   

       })

    })

 5)使用瀏覽器做測試

     http:IP地址/index.html#/路由地址
實例

<body ng-app="myModule">
<ul>
<li><a href="#/page1">page1</a></li>
<li><a href="#/page2">page2</a></li>
</ul>
<div ng-view>
</div>
</body>
<script src="js/angular.js" type="text/javascript" charset="utf-8"></script>
<script src="js/angular-route.js" type="text/javascript" charset="utf-8"></script>
<script src="js/singlePage.js" type="text/javascript" charset="UTF-8"></script>

//singlePage.js文件內容
var module = angular.module("myModule",["ng","ngRoute"]);
module.config(function ($routeProvider){
$routeProvider.when("/page1",{
templateUrl:"temp/page1.html"
}).when("/page2",{
templateUrl:"temp/page2.html"
})
})

ngroute中的頁面跳轉有兩種方式:
- 通過超鏈接訪問href="#/main"
- 通過js跳轉$location.path("/main")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容