AngularJS入門心得之directive和controller通訊過程_AngularJS

來源:互聯網
上載者:User

AngularJS 通過新的屬性和運算式擴充了 HTML。Angularjs學習起來也非常的簡單。

1.AngularJS是何方神聖

Angular JS (Angular.JS) 是一組用來開發Web頁面的架構、模板以及資料繫結和豐富UI組件。它支援整個開發進程,提供web應用的架構,無需進行手工DOM操作。

AngularJS是為了克服HTML在構建應用上的不足而設計的。HTML是一門很好的為靜態文本展示設計的聲明式語言,但要構建WEB應用的話它就顯得乏力了。這裡AngularJS就應運而生,彌補了HTML的天然缺陷,用於構件Web應用等。

2.如何瞭解AngularJS

AngularJS誕生於2009年,由Misko Hevery 等人建立,後為Google所收購。

AngularJS官網 : http://www.angularjs.org (一般來說會被牆掉,所以可以訪問下面的網站)

AngularJS中文網站 : http://www.ngnice.com

書籍 :《AngularJS 權威教程》《用AngularJS開發下一代Web應用》等。個人意見,For your information

備忘 :視頻教程,最近有看過大漠老師的AngularJS教程,覺得還不錯,但是感覺沒有一點基礎還是聽不懂的,或者要看好幾遍(不是做廣告)

3.為什麼要瞭解AngularJS

一項新技術能夠面世,為眾人所知,從而脫引而出,定然不是空穴來風,肯定有其標新立異的過人之處,主要有以下幾點:

(1)MVC的思想(或者是MVVM)

(2)模組化和依賴注入

(3)雙向資料繫結

(4)指令

每一個特性都可以大篇幅的展開,顯然,目前能力不夠,沒法展開,有興趣可以網上搜下,大體瞭解。

今天主要來說說AngularJS的三個指令“ @ ”,“ = ”,“ & ”的用法和區別(這個問題困擾了我大半天,和Frank交流多次,我才明白)

1.指令範圍中的@

作用是把當前屬性作為字串傳遞。

先上代碼,前台介面:

<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl"><drink water="{{pureWater}}"></drink></div></body><script src="../js/angular.js"><script src="ScopeAt.js"></script></html>

JS代碼:

var myModule = angular.module("MyModule", []);myModule.controller('MyCtrl', ['$scope', function($scope){$scope.pureWater="純淨水";}])myModule.directive("drink", function() {return {restrict:'AE',scope:{water:'@'},template:"<div>{{water}}</div>"}});

執行的結果平淡無奇,卻暗藏玄機: 

(1) HTML頁面中,聲明一個標籤<drink></drink>,其中定義一個屬性名稱:water 屬性值:pureWater(這裡的{{}}是angularjs的一種常見運算式,類似於ng-model,用於值綁定)

(2) JS檔案中,首先從模組開始,然後建立一個控制器行2~行4,再定義一個指令,主要實現的是將"<drink></drink>"替換為"<div>{{water}}</div>"標籤顯示

(3) 重點介紹這裡的

scope:{water:'@'}

該運算式等價於:

link:function(scope,element,attrs){scope.water=attrs.water;}

具體含義就是在指令的scope上定義一個屬性名稱:water,它的值就是前台介面中water屬性的值,也就是"{{pureWater}}";

同時{{pureWater}}的值我們從聲明的控制器可以看出:

$scope.pureWater="純淨水";

所以最終頁面顯示的是“純淨水”,主要的流程就是:

a.在指令中,通過@實現指令與HTML頁面元素關聯;

b.在控制器中又實現了與頁面的聯絡;

c.從而藉助HTML頁面建立起控制器與指令的聯絡,也是一種通訊方式。

具體見下圖:

 

2.指令範圍中的=

作用是與父scope中的屬性進行雙向繫結。

<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl">Ctrl:<br><input type="text" ng-model="pureWater"><br>Directive:<br><drink water="pureWater"></drink></div></body><script src="../js/angular.js"></script><script src="ScopeEqual.js"></script></html>var myModule = angular.module("MyModule", []);myModule.controller('MyCtrl', ['$scope', function($scope){$scope.pureWater="純淨水";}])myModule.directive("drink", function() {return {restrict:'AE',scope:{water:'='},template:'<input type="text" ng-model="water"/>'}});

這裡=的手段類似,通過版面設定兩個輸入框,分別代表指令和控制器的範圍,在JS代碼實現了雙向繫結,做到了控制器與指令在各自範圍內能夠影響對方,也就是雙向通訊,具體思路與@類似,不贅述,上圖:

3.指令範圍中的&

主要作用是傳遞一個來自父scope的函數,稍後調用。

<!doctype html><html ng-app="MyModule"><head><meta charset="utf-"><link rel="stylesheet" href="../css/bootstrap.css"></head><body><div ng-controller="MyCtrl"><greeting greet="sayHello(name)"></greeting><greeting greet="sayHello(name)"></greeting><greeting greet="sayHello(name)"></greeting></div></body><script src="../js/angular.js"></script><script src="ScopeAnd.js"></script></html>var myModule = angular.module("MyModule", []);myModule.controller('MyCtrl', ['$scope', function($scope){$scope.sayHello=function(name){alert("Hello "+name);}}])myModule.directive("greeting", function() {return {restrict:'AE',scope:{greet:'&'},template:'<input type="text" ng-model="userName" /><br/>'+'<button class="btn btn-default" ng-click="greet({name:userName})">Greeting</button><br/>'}});

從頁面可以看出,這裡定義了一個標籤<greeting></greeting>,並在其中定義了屬性名稱greet,與上面的@以及=不同的是,屬性名稱後面是一個方法,所以,這裡的&主要用於在Controller和directive之間傳遞函數,實現兩者之間的函數通訊,在JS中,將前台的greeting標籤替換為template中的內容,一個輸入框加上一個按鈕,按鈕上綁定了greet函數,與前台頁面的greet相呼應,而前台的greet函數在控制器中有定義,所以指令中也是調用的控制器中的greet函數。執行結果如下:

(1)初始介面

 

(2)在第一個文字框填值

 

(2)在第二個文字框填值

 

(3)在第三個文字框填值

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.