深入淺析AngularJS中的module(模塊)
什么是AngularJS的模塊
我們所說(shuō)的模塊,是你的AngularJS應(yīng)用程序的一個(gè)組成部分,它可以是一個(gè)Controller,也可以是一個(gè)Service服務(wù),也可以是一個(gè)過(guò)濾器(Filter),也可以是一個(gè)directive(指令)等等…都是屬于一個(gè)模塊!
大多數(shù)的應(yīng)用程序都是有一個(gè)自己的函數(shù)入口方法Main ,用它來(lái)進(jìn)行初始化,以及加載裝配各個(gè)模塊,然后這些模塊的組合,構(gòu)成了你的應(yīng)用程序,對(duì)吧?
但是,but, AngularJS應(yīng)用程序卻不是這樣的哦,它沒(méi)有main 方法,沒(méi)有函數(shù)入口。代替之的是在模塊中指定聲明這個(gè)模塊在AngularJS應(yīng)用程序中該如何去加載,啟動(dòng)。
這種方法有以下幾個(gè)優(yōu)點(diǎn):
1) 使用聲明的方式,讓人更加容易理解。
2) 你可以更加容易的讓你的代碼進(jìn)行重用。
3) 模塊的加載順序就更加容易控制了。因?yàn)檫@些模塊是延遲執(zhí)行的。
4) 對(duì)于進(jìn)行單元測(cè)試就變得更加的方便了。更加可靠,你只需要載入這個(gè)模塊就可以進(jìn)行測(cè)試了。
5) 端對(duì)端的測(cè)試中,你可以使用模塊去重寫(xiě)配置。
在AngularJS中module是一個(gè)核心的存在,包括了很多方面,比如controller, config, service, factory, directive, constant, 等等。
在Javascript中如何實(shí)現(xiàn)類(lèi)似module的功能呢?
或者說(shuō),我們定義一個(gè)函數(shù),如何把函數(shù)內(nèi)的函數(shù)向外界開(kāi)放呢?
我想,可以把函數(shù)中的函數(shù)作為一個(gè)對(duì)象的鍵值,從而向外界開(kāi)放。
這樣說(shuō)很籠統(tǒng),其實(shí)是這樣的:
var myModule = function outerFuction(){
var method1 = new function(){}
var method2 = new function(){}
return{
method1: method1,
method2, method2
}
}
var o = outerFucntion();
o.method1();
o.mehtod2();
舉個(gè)銀行存錢(qián)取錢(qián)的例子。
var account = function(){
//余額
var balance = 0;
//存錢(qián)
var deposit = function(money){
balance+=money;
console.log("卡上余額為: " + balance);
notifyUser();
}
//取錢(qián)
var withdraw = function(money){
balance -= money;
console.log("卡上余額為: " + balance)
notifyUser();
}
//通知用戶
var notifyUser = function(){
console.log("卡上余額有變動(dòng)");
}
return {
deposit:deposit,
withdraw: withdraw
}
}
var a1 = account();
a1.deposit(100);
a1.withdraw(50);
再來(lái)到AngularJS,我們已經(jīng)習(xí)慣了這樣寫(xiě):
var app = angular.module('app',[]);
app.config();
app.controller();
app.factory();
...
也就是獲取到module,再調(diào)用module提供給我們的方法。
查看angular.js源代碼,發(fā)現(xiàn):
angular = window.angular || (window.angular = {} )
這是為什么我們能使用angular這個(gè)變量的原因。
...
var moduleInstace = {
provider: invokeLater('$provide','provider'),
factory: invokeLater('$provider', 'factory'),
service: invokeLater('$provider', 'service'),
value: invokeLater('$provide', 'value'),
constant: invokeLater('$provider', 'constant'...),
animation: invokeLater('$animateProvider',...),
filter: invokeLater('$filterProvider',...),
controller: invokeLater('$controllerProvider',...),
directive: invokeLater('$compileProvider',...),
config: config,
}
return moduleInstance;
...
以上的寫(xiě)法正是module的寫(xiě)法。
PS:angular.module('MyApp',[...])和angular.module('MyApp')之間有一個(gè)很小但是卻很重要的不同點(diǎn)
angular.module('MyApp',[...])會(huì)創(chuàng)建一個(gè)新的Angular模塊,然后把方括號(hào)([...])中的依賴列表加載進(jìn)來(lái);而angular.module('MyApp')會(huì)使用由第一個(gè)調(diào)用定義的現(xiàn)有的模塊。
所以,對(duì)于以下代碼,你需要保證在整個(gè)應(yīng)用中只會(huì)使用一次:
angular.module('MyApp', [...]) //如果你的應(yīng)用是模塊化的,這里可能是MyModule
如果你不打算把模塊的引用存到一個(gè)變量中,然后在整個(gè)應(yīng)用中通過(guò)這個(gè)變量來(lái)引用模塊,那么,在其他文件中使用angular.module(MyApp)的方式可以保證得到正確的AngularJS模塊引用。模塊上的所有東西都必須通過(guò)訪問(wèn)這個(gè)模塊引用來(lái)定義,或者在模塊定義的地方把那些必備的內(nèi)容添加上去。
- JavaScript的Module模式編程深入分析
- nodejs中exports與module.exports的區(qū)別詳細(xì)介紹
- seajs1.3.0源碼解析之module依賴有序加載
- node.js的exports、module.exports與ES6的export、export default深入詳解
- 詳解Sea.js中Module.exports和exports的區(qū)別
- node.js報(bào)錯(cuò):Cannot find module ''ejs''的解決辦法
- node.js中module.exports與exports用法上的區(qū)別
- 詳解AngularJS中module模塊的導(dǎo)入導(dǎo)出
- AngularJS Module方法詳解
- js module大戰(zhàn)
相關(guān)文章
深入學(xué)習(xí)JavaScript的AngularJS框架中指令的使用方法
這篇文章主要介紹了深入學(xué)習(xí)JavaScript的AngularJS框架中指令的使用方法,指令的使用是Angular入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-03
AngularJS實(shí)現(xiàn)根據(jù)不同條件顯示不同控件
本篇文章主要介紹了AngularJS實(shí)現(xiàn)根據(jù)不同條件顯示不同控件的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
angular中實(shí)現(xiàn)控制器之間傳遞參數(shù)的方式
本篇文章主要介紹了angular中實(shí)現(xiàn)控制器之間傳遞參數(shù)的方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
詳解Angular中實(shí)現(xiàn)自定義組件的雙向綁定的兩種方法
這篇文章主要介紹了詳解Angular中實(shí)現(xiàn)自定義組件的雙向綁定的兩種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
angular-ui-sortable實(shí)現(xiàn)可拖拽排序列表
這篇文章主要介紹了angular-ui-sortable實(shí)現(xiàn)可拖拽排序列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
簡(jiǎn)單談?wù)凙ngular中的獨(dú)立組件的使用
這篇文章主要介紹了簡(jiǎn)單談?wù)凙ngular中的獨(dú)立組件的使用的相關(guān)資料,通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),需要的朋友可以參考下2022-08-08
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
ng-template 是用來(lái)定義模板的,當(dāng)使用ng-template定義好一個(gè)模板之后,可以用ng-container和templateOutlet指令來(lái)進(jìn)行使用。這篇文章給大家介紹了Angular中的ng-templateangular及使用 ngTemplateOutlet 指令的方法,需要的朋友參考下吧2018-08-08
angularjs下ng-repeat點(diǎn)擊元素改變樣式的實(shí)現(xiàn)方法
今天小編就為大家分享一篇angularjs下ng-repeat點(diǎn)擊元素改變樣式的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
初學(xué)者AngularJS的環(huán)境搭建過(guò)程
這篇文章主要介紹了初學(xué)者AngularJS的環(huán)境搭建過(guò)程,在文章給大家提到了Angular-cli的特性,大家一起看看吧2017-10-10

