AngularJS中的模組詳解,AngularJS模組詳解

來源:互聯網
上載者:User

AngularJS中的模組詳解,AngularJS模組詳解

在講angularjs的模組之前,我們先介紹一下angular的一些知識點:

AngularJS是純用戶端技術,完全用Javascript編寫的。它使用的是網頁開發的常規技術(HTML,CSS,Javascript),目的是讓網頁應用開發更快更容易。

AngularJS簡化應用開發的一個重要方法是,將一個些通用的低級開發操作封裝起來提供給開發人員。AngularJS會自動處理好這些低級操作。它們包括:

1.DOM操作
2.設定事件的監聽
3.輸入驗證,因為AngularJS會處理大部分這些操作,所以開發人員就能更多的專註在應用的商務邏輯上,更少地編寫那些重複性的、易錯的、低級的代碼。

在AngularJS簡化開發的同時,它也為用戶端帶來了一些精巧的技術,它們包括:

1.資料、商務邏輯、視圖的分離
2.資料和視圖的自動綁定
3.泛型服務
4.依賴注入(主要用於彙總服務)
5.可擴充的HTML編譯器(完全由JavaScript編寫)
6.易於測試
7.用戶端對這些技術的需求其實已經存在很久了。

同時,你還可以用AngularJS來開發單頁或者多頁的應用,不過其主要還是用來開發單頁的。 AngularJS支援瀏覽器的曆史操作,向前,向後按鈕,單頁應用中的收藏操作。

接下來,我們來詳細講解angularJS的模組。

大部分應用都有一個主方法用來執行個體化、組織、啟動應用。AngularJS應用沒有主方法,而是使用模組來聲明應用應該如何啟動。這種方式有以下幾個優點:

1.啟動過程是聲明式的,所以更容易懂。
2.在單元測試是不需要載入全部模組的,因此這種方式有助於寫單元測試。
3.可以在特定情況的測試中增加額外的模組,這些模組能更改配置,能協助進行端對端的測試。
4.第三方代碼可以打包成可重用的模組。
5.模組可以以任何先後或者並行的順序載入(因為模組的執行本身是延遲的)。

舉個例子:

<!doctype html><html ng-app="myApp"> <head>  <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>  <script>      var myAppModule = angular.module('myApp', []);      // configure the module.      // in this example we will create a greeting filter      myAppModule.filter('greet', function() {         return function(name) {            return 'Hello, ' + name + '!';         };      });  </script> </head> <body>  <div>   {{ 'World' | greet }}  </div> </body></html>

上面的例子,我們是通過在<html ng-app="myApp">中進行指定,來實現使用myApp這個模組啟動應用的。

以上這個例子寫法很簡單,但是不適合用同樣的寫法來寫大型應用。我們推薦是將你的應用拆分成以下幾個模組:

1.一個服務模組,用來做服務的聲明。
2.一個指令模組,用來做指令的聲明。
3.一個過濾器模組,用來做過濾器聲明。
4.一個依賴以上模組的應用級模組,它包含初始化代碼。

舉個例子:

<!doctype html><html ng-app="xmpl"> <head>  <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>  <script src="script.js"></script> </head> <body>  <div ng-controller="XmplController">   {{ greeting }}!  </div> </body></html>[/code]script.js:[code]angular.module('xmpl.service', []).   //服務模組 value('greeter', {    //自訂greeter對象  salutation: 'Hello',  localize: function(localization) {    this.salutation = localization.salutation;  },  greet: function(name) {    return this.salutation + ' ' + name + '!';  } }). value('user', {   //自訂user對象  load: function(name) {    this.name = name;  } });angular.module('xmpl.directive', []);  //指令模組angular.module('xmpl.filter', []);   //過濾器模組angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']).  //模組xmpl依賴於數組中的模組 run(function(greeter, user) {  // 初始化代碼,應用啟動時,會自動執行  greeter.localize({    salutation: 'Bonjour'  });  user.load('World'); })// A Controller for your appvar XmplController = function($scope, greeter, user) {   $scope.greeting = greeter.greet(user.name);}

這樣拆分的原因是,在你的測試中常常需要忽略掉初始化代碼,因為這些代碼比較難測試。通過把它拆分出來就能在測試中方便地忽視掉它。通過只載入和當前測試相關的模組,也能使測試更專一。以上只是一個建議,你可以放心根據你的具體情況來調整。

一個模組就是一系列配置和代碼塊的集合,它們是在啟動階段就附加到應用上的。一個最簡單的模組由兩類代碼塊集合組成的:

配置代碼塊 - 在注入提供者注入和設定階段執行。只有注入提供者和常量可以被注入到配置塊中。這是為了防止服務在被配置好之前就被提前初始化。
運行代碼塊 - 在注入器被建立後執行,被用來啟動應用的。只有執行個體和常量能被注入到運行塊中。這是為了防止在運行後還出現對系統的配置。

代碼實現:

angular.module('myModule', []).    config(function(injectables) { // provider-injector      配置代碼塊    // This is an example of config block.    // You can have as many of these as you want.    // You can only inject Providers (not instances)    // into the config blocks.  }). run(function(injectables) { // instance-injector      運行代碼塊    // This is an example of a run block.    // You can have as many of these as you want.    // You can only inject instances (not Providers)    // into the run blocks  });

模組還有一些配置的簡便方法,使用它們的效果等同於使用代碼塊。舉個例子:

angular.module('myModule', []). value('a', 123). factory('a', function() { return 123; }). directive('directiveName', ...). filter('filterName', ...);// is same asangular.module('myModule', []). config(function($provide, $compileProvider, $filterProvider) {  $provide.value('a', 123)  $provide.factory('a', function() { return 123; })  $compileProvider.directive('directiveName', ...).  $filterProvider.register('filterName', ...); });

配置塊會按照$provide, $compileProvider, $filterProvider,註冊的順序,依次被應用。唯一的例外是對常量的定義,它們應該始終放在配置塊的開始處。

運行塊是AngularJS中最像主方法的東西。一個運行塊就是一段用來啟動應用的代碼。它在所有服務都被配置和所有的注入器都被建立後執行。運行塊通常包含了一些難以測試的代碼,所以它們應該寫在單獨的模組裡,這樣在單元測試時就可以忽略它們了。

模組可以把其他模組列為它的依賴。“依賴某個模組”意味著需要把這個被依賴的模組在本塊模組之前被載入。換句話說被相依模組的配置塊會在本模組配置塊前被執行。運行塊也是一樣。任何一個模組都只能被載入一次,即使它被多個模組依賴。

模組是一種用來管理$injector配置的方法,和指令碼的載入沒有關係。現在網上已有很多控制模組載入的庫,它們可以和AngularJS配合使用。因為在載入期間模組不做任何事情,所以它們可以以任意順序或者並行方式載入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.