AngularJS中的模塊詳解
在講angularjs的模塊之前,我們先介紹一下angular的一些知識(shí)點(diǎn):
AngularJS是純客戶端技術(shù),完全用Javascript編寫的。它使用的是網(wǎng)頁開發(fā)的常規(guī)技術(shù)(HTML,CSS,Javascript),目的是讓網(wǎng)頁應(yīng)用開發(fā)更快更容易。
AngularJS簡化應(yīng)用開發(fā)的一個(gè)重要方法是,將一個(gè)些通用的低級(jí)開發(fā)操作包裝起來提供給開發(fā)者。AngularJS會(huì)自動(dòng)處理好這些低級(jí)操作。它們包括:
1.DOM操作
2.設(shè)置事件的監(jiān)聽
3.輸入驗(yàn)證,因?yàn)锳ngularJS會(huì)處理大部分這些操作,所以開發(fā)者就能更多的專注在應(yīng)用的業(yè)務(wù)邏輯上,更少地編寫那些重復(fù)性的、易錯(cuò)的、低級(jí)的代碼。
在AngularJS簡化開發(fā)的同時(shí),它也為客戶端帶來了一些精巧的技術(shù),它們包括:
1.數(shù)據(jù)、業(yè)務(wù)邏輯、視圖的分離
2.數(shù)據(jù)和視圖的自動(dòng)綁定
3.通用服務(wù)
4.依賴注入(主要用于聚合服務(wù))
5.可擴(kuò)展的HTML編譯器(完全由JavaScript編寫)
6.易于測(cè)試
7.客戶端對(duì)這些技術(shù)的需求其實(shí)已經(jīng)存在很久了。
同時(shí),你還可以用AngularJS來開發(fā)單頁或者多頁的應(yīng)用,不過其主要還是用來開發(fā)單頁的。 AngularJS支持瀏覽器的歷史操作,向前,向后按鈕,單頁應(yīng)用中的收藏操作。
接下來,我們來詳細(xì)講解angularJS的模塊。
大部分應(yīng)用都有一個(gè)主方法用來實(shí)例化、組織、啟動(dòng)應(yīng)用。AngularJS應(yīng)用沒有主方法,而是使用模塊來聲明應(yīng)用應(yīng)該如何啟動(dòng)。這種方式有以下幾個(gè)優(yōu)點(diǎn):
1.啟動(dòng)過程是聲明式的,所以更容易懂。
2.在單元測(cè)試是不需要加載全部模塊的,因此這種方式有助于寫單元測(cè)試。
3.可以在特定情況的測(cè)試中增加額外的模塊,這些模塊能更改配置,能幫助進(jìn)行端對(duì)端的測(cè)試。
4.第三方代碼可以打包成可重用的模塊。
5.模塊可以以任何先后或者并行的順序加載(因?yàn)槟K的執(zhí)行本身是延遲的)。
舉個(gè)例子:
<!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">中進(jìn)行指定,來實(shí)現(xiàn)使用myApp這個(gè)模塊啟動(dòng)應(yīng)用的。
以上這個(gè)例子寫法很簡單,但是不適合用同樣的寫法來寫大型應(yīng)用。我們推薦是將你的應(yīng)用拆分成以下幾個(gè)模塊:
1.一個(gè)服務(wù)模塊,用來做服務(wù)的聲明。
2.一個(gè)指令模塊,用來做指令的聲明。
3.一個(gè)過濾器模塊,用來做過濾器聲明。
4.一個(gè)依賴以上模塊的應(yīng)用級(jí)模塊,它包含初始化代碼。
舉個(gè)例子:
<!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', []). //服務(wù)模塊 value('greeter', { //自定義greeter對(duì)象 salutation: 'Hello', localize: function(localization) { this.salutation = localization.salutation; }, greet: function(name) { return this.salutation + ' ' + name + '!'; } }). value('user', { //自定義user對(duì)象 load: function(name) { this.name = name; } }); angular.module('xmpl.directive', []); //指令模塊 angular.module('xmpl.filter', []); //過濾器模塊 angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']). //模塊xmpl依賴于數(shù)組中的模塊 run(function(greeter, user) { // 初始化代碼,應(yīng)用啟動(dòng)時(shí),會(huì)自動(dòng)執(zhí)行 greeter.localize({ salutation: 'Bonjour' }); user.load('World'); }) // A Controller for your app var XmplController = function($scope, greeter, user) { $scope.greeting = greeter.greet(user.name); }
這樣拆分的原因是,在你的測(cè)試中常常需要忽略掉初始化代碼,因?yàn)檫@些代碼比較難測(cè)試。通過把它拆分出來就能在測(cè)試中方便地忽視掉它。通過只加載和當(dāng)前測(cè)試相關(guān)的模塊,也能使測(cè)試更專一。以上只是一個(gè)建議,你可以放心根據(jù)你的具體情況來調(diào)整。
一個(gè)模塊就是一系列配置和代碼塊的集合,它們是在啟動(dòng)階段就附加到應(yīng)用上的。一個(gè)最簡單的模塊由兩類代碼塊集合組成的:
配置代碼塊 - 在注入提供者注入和配置階段執(zhí)行。只有注入提供者和常量可以被注入到配置塊中。這是為了防止服務(wù)在被配置好之前就被提前初始化。
運(yùn)行代碼塊 - 在注入器被創(chuàng)建后執(zhí)行,被用來啟動(dòng)應(yīng)用的。只有實(shí)例和常量能被注入到運(yùn)行塊中。這是為了防止在運(yùn)行后還出現(xiàn)對(duì)系統(tǒng)的配置。
代碼實(shí)現(xiàn):
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 運(yùn)行代碼塊 // 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 });
模塊還有一些配置的簡便方法,使用它們的效果等同于使用代碼塊。舉個(gè)例子:
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', ...); });
配置塊會(huì)按照$provide, $compileProvider, $filterProvider,注冊(cè)的順序,依次被應(yīng)用。唯一的例外是對(duì)常量的定義,它們應(yīng)該始終放在配置塊的開始處。
運(yùn)行塊是AngularJS中最像主方法的東西。一個(gè)運(yùn)行塊就是一段用來啟動(dòng)應(yīng)用的代碼。它在所有服務(wù)都被配置和所有的注入器都被創(chuàng)建后執(zhí)行。運(yùn)行塊通常包含了一些難以測(cè)試的代碼,所以它們應(yīng)該寫在單獨(dú)的模塊里,這樣在單元測(cè)試時(shí)就可以忽略它們了。
模塊可以把其他模塊列為它的依賴?!耙蕾嚹硞€(gè)模塊”意味著需要把這個(gè)被依賴的模塊在本塊模塊之前被加載。換句話說被依賴模塊的配置塊會(huì)在本模塊配置塊前被執(zhí)行。運(yùn)行塊也是一樣。任何一個(gè)模塊都只能被加載一次,即使它被多個(gè)模塊依賴。
模塊是一種用來管理$injector配置的方法,和腳本的加載沒有關(guān)系?,F(xiàn)在網(wǎng)上已有很多控制模塊加載的庫,它們可以和AngularJS配合使用。因?yàn)樵诩虞d期間模塊不做任何事情,所以它們可以以任意順序或者并行方式加載
相關(guān)文章
AngularJS基礎(chǔ) ng-keydown 指令簡單示例
本文主要介紹AngularJS ng-keydown 指令,在這里幫大家整理了ng-keydown 指令的基礎(chǔ)資料,并附有代碼,有需要的朋友可以參考下2016-08-08Angular2實(shí)現(xiàn)的秒表及改良版示例
這篇文章主要介紹了Angular2實(shí)現(xiàn)的秒表及改良版,結(jié)合實(shí)例形式分析 Angular2實(shí)現(xiàn)秒表功能的原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-05-05Angular7中創(chuàng)建組件/自定義指令/管道的方法實(shí)例詳解
這篇文章主要介紹了在angular7中創(chuàng)建組件/自定義指令/管道的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04Angularjs 實(shí)現(xiàn)分頁功能及示例代碼
這篇文章主要介紹了Angularjs 實(shí)現(xiàn)分頁功能及示例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09Angular.JS實(shí)現(xiàn)無限級(jí)的聯(lián)動(dòng)菜單(使用demo)
這篇文章主要介紹了Angular.JS中實(shí)現(xiàn)無限級(jí)聯(lián)動(dòng)菜單的使用示例,本文是在之前的一篇文章的基礎(chǔ)上進(jìn)行的幾個(gè)demo分享,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02詳解Monaco?Editor中的Keybinding機(jī)制
這篇文章主要為大家介紹了詳解Monaco?Editor中的Keybinding機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09