在講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>
上面的例子,我們是透過在中指定,來實現使用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 app var 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 as angular.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一起使用。因為在載入期間模組不做任何事情,所以它們可以以任意順序或並行方式載入