angularjs 學習筆記之一

1.  

ng-app 指令定義一個 AngularJS 應用程序。

ng-model 指令把元素值(比如輸入域的值)綁定到應用程序。

ng-bind 指令把應用程序數據綁定到 HTML 視圖。

2.、AngularJS 事件廣播與接收

發送消息: $scope.$emit(name, data) 或者 $scope.$broadcast(name, data);

接收消息: $scope.on(name,function(event,data){ });

區別: $emit 廣播給父controller   $broadcast 廣播給子controller

broadcast 是從發送者向他的子scope廣播一個事件。

這裏就是ParentController發送, ParentController 和 ChildController 會接受到, 而MainController是不會收到的

$emit 廣播給父controller,父controller 是可以收到消息

$on 有兩個參數function(event,msg)  第一個參數是事件對象,第二個參數是接收到消息信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
angular.module('onBroadcastEvent', ['ng'])
     .controller('MainController'function($scope) {
       $scope.$on('To-MainController'function(event,msg) {
         console.log('MainController received:' + msg);
       });
     })
     .controller('ParentController'function($scope) {
       $scope.click = function (msg) {
         $scope.$emit('To-MainController',msg + ',from ParentController to MainController');
         $scope.$broadcast('To-ChildController', msg + ',from ParentController to ChildController');
         $scope.$broadcast('To-BrotherController', msg + ',from ParentController to BrotherController');
       }
     })
     .controller('ChildController'function($scope){
       $scope.$on('To-ChildController'function(event,msg) {
         console.log('ChildController received:' + msg);
       });
     })
     .controller('BrotherController'function($scope){
       $scope.$on('To-BrotherController'function(event, msg) {
         console.log('BrotherController received:' + msg);
       });
     });

3 特性五:指令(Directives)

指令是我個人最喜歡的特性。你是不是也希望瀏覽器可以做點兒有意思的事情?那麼AngularJS可以做到。

指令可以用來創建自定義的標籤。它們可以用來裝飾元素或者操作DOM屬性。可以作爲標籤、屬性、註釋和類名使用。

這裏是一個例子,它監聽一個事件並且針對的更新它的$scope ,如下:

myModule.directive('myComponent', function(mySharedService) {

    return {

        restrict: 'E',

        controller: function($scope, $attrs, mySharedService) {

            $scope.$on('handleBroadcast', function() {

                $scope.message = 'Directive: ' + mySharedService.message;

            });

        },

        replace: true,

        template: '<input>'

    };

});

然後,你可以使用這個自定義的directive來使用:

<my-component ng-model="message"></my-component>

使用一系列的組件來創建你自己的應用將會讓你更方便的添加,刪除和更新功能。

4 數據綁定

AngularJS的雙向數據綁定,意味着你可以在Mode(JS)中改變數據,而這些變動立刻就會自動出現在View上,反之亦然。即:一方面可以做到model變化驅動了DOM中元素變化,另一方面也可以做到DOM元素的變化也會影響到Model。

在我們使用jQuery的時候,代碼中會大量充斥類似這樣的語句:var val = $(#id).val(); $(#id).html(str);等等,即頻繁的DOM操作(讀取和寫入),其實我們的最終目的並不是要操作DOM,而是要實現業務邏輯。ng的綁定將讓你擺脫DOM操作,只要模板與數據通過聲明進行了綁定,兩者將隨時保持同步,最新的數據會實時顯示在頁面中,頁面中用戶修改的數據也會實時被記錄在數據模型中。

從View到Controller再到View的數據交互(例01):

4.2.2 module (待進一步理解)

首先需要明確一下模板的概念。在我還不知道有模板這個東西的時候,曾經用js拼接出很長的HTML字符串,然後append到頁面中,這種方式想想真是又土又笨。後來又看到可以把HTML代碼包裹在一個<script>標籤中當作模板,然後按需要取來使用。

ng中,模板十分簡單,它就是我們頁面上的HTML代碼,不需要附加任何額外的東西。在模板中可以使用各種指令來增強它的功能,這些指令可以讓你把模板和數據巧妙的綁定起來。

<html>標籤上多了一個屬性ng-app=MyApp”,它的作用就是用來指定ng的作用域是在<html>標籤以內部分。在js中,我們調用angular對象的module方法來聲明一個模塊,模塊的名字和ng-app的值對應。這樣聲明一下就可以讓ng運行起來了。

示例:

<html ng-app="demoApp">

var demoApp = angular.module('demoApp', []);

4.2.3 ng-controller ($scope 作用域的理解)

要明確創建一個$scope 對象,我們就要給DOM元素安上一個controller對象,使用的是ng-controller 指令屬性:

<div ng-controller="MyController"> {{ person.name }} </div>  

ng-controller指令給所在的DOM元素創建了一個新的$scope 對象,並將這個$scope 對象包含進外層DOM元素的$scope 對象裏。在上面的例子裏,這個外層DOM元素的$scope 對象,就是$rootScope 對象。這個scope鏈是這樣的:

 

 

所有scope都遵循原型繼承(prototypal inheritance),這意味着它們都能訪問父scope們。對任何屬性和方法,如果AngularJS在當前scope上找不到,就會到父 scope上去找,如果在父scope上也沒找到,就會繼續向上回溯,一直到$rootScope 上。即如果controller是多層嵌套的,就會從最裏面一直往外找,這個scope鏈是這樣的:

 

唯一的例外:有些指令屬性可以選擇性地創建一個獨立的scope,讓這個scope不繼承它的父scope們,這個會在指令詳解中說明。

4.6.4特殊的ng-srcng-href({{}}顯示代碼的問題

在說明這兩個指令的特殊之前,需要先了解一下ng的啓動及執行過程,如下圖:

 

1) 瀏覽器加載靜態HTML文件並解析爲DOM

  2) 瀏覽器加載angular.js文件;

  3) angular監聽DOMContentLoaded 事件,監聽到時開始啓動;

  4) angular尋找ng-app指令,確定作用範圍;

  5) 找到app中定義的Module使用$injector服務進行依賴注入;

  6) 根據$injector服務創建$compile服務用於編譯;

  7) $compile服務編譯DOM中的指令、過濾器等;

  8) 使用ng-init指令,將作用域中的變量進行替換;

  9) 最後生成了我們在最終視圖。

  可以看到,ng框架是在DOMcontent加載完畢後纔開始發揮作用。假如我們模板中有一張圖片如下:

  <img src="http://m.cnblogs.com/142260/{{imgUrl}}” />

  那麼在頁面開始加載到ng編譯完成之前,頁面上會一直顯示一張錯誤的圖片,因爲路徑{{imgUrl}}還未被替換。

  爲了避免這種情況,我們使用ng-src指令,這樣在路徑被正確得到之前就不會顯示找不到圖片。同理,<a>標籤的href屬性也需要換成ng-href,這樣頁面上就不會先出現一個地址錯誤的鏈接。

順着這個思路再多想一點,我們在模板中使用{{}}顯示數據時,在ng編譯完成之前頁面上豈不是會顯示出大括號及裏面的表達式?確實是這樣。爲了避免這個,ng中有一個與{{}}等同的指令:ng-bind,同樣用於單向綁定,在頁面剛加載的時候就不會顯示出對用戶無用的數據了。儘管這樣你可能不但沒舒心反而更糾結了,{{}}那麼好用易理解,還不能用了不成?好消息是我們依然可以使用。因爲我編寫的是單頁面應用,頁面只會在加載index.html的時

候出這個問題,只需在index.html中的模板中換成ng-bind就行。其他的模板是我們動態加載的,就可以放心使用{{}}了。











發佈了34 篇原創文章 · 獲贊 33 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章