模塊定義了一個應用程序。控制器通常屬於一個模塊。
JavaScript 中應避免使用全局函數。因為他們很容易被其他腳本文件覆蓋。
AngularJS 模塊讓所有函數的作用域在該模塊下,避免了該問題。
簡單的定義一個Angular模塊(module)
var app = angular.module("myApp", []);
這種方法帶有兩個參數,一個是模板名,一個是依賴注入列表【該模塊所依賴的模塊】,數組為空,表示當前注冊的模板不需要依賴關系。
如果依賴不為空,則要保證其依賴的模塊已經加載。這里面就有個加載順序的問題。
最簡單的情況下,我把使用模塊所在的JS文件全部按順序列在HTML的script元素中,只要保證模塊之間的依賴關系正確即可,如:
<script src="/scripts/myApp.js"></script>
<script src="/scripts/app.js"></script>
如果app.js中的模塊依賴模塊myApp,則需先將定義它的myApp.js加載進來。在項目實踐中,這種方法顯然是不實際的,你不能在一開始把所有的JS文件全部加載進來。
通常會使用一些延遲/異步加載機制,如使用RequireJS。
使用RequireJS定義的Angular模塊可以是這樣:
define(['angular'], function(angular) {
angular.module('myApp', [])
.controller('MyController', ['$scope', function ($scope) {
//define scope data
}]);
});
其中define函數加載了angular.js,並取得angular模塊,然后定義了myApp模塊。
如果myApp模塊(或者MyController)依賴於其他模塊(或組件),則需要告訴RequireJS在需要的時候加載:
define(['angular', './scripts/anotherApp', './scripts/service/utility' ], function(angular) { //上面加載了3個js文件
angular.module('myApp', ['newApp']) //定義的myAPP模塊需要依賴newApp模塊(此模塊所在的js文件需要引進來)
.controller('MyController', ['$scope', 'utils', function ($scope, utils) { //'MyController'依賴的一些組件scope等
//define scope data
}]);
});
這里,myApp依賴定義於anotherApp.js的newApp模塊,並且需要定義於utility.js的工廠服務utils。這里存在的一個陷阱是,依賴的兩個JS文件不一定會按照代碼中聲明的順序加載,即utility.js可能先於anotherApp.js加載。因此在使用requireJS加載依賴時,要注意這些依賴本身之間的相互關系,不能指望requires按某種順序加載這些依賴。否則,會導致一些概率性出現的問題,不易調試。
另外一點,如果在首次定義模塊A時使用了空數組作為依賴,然后在某次使用A模塊的過程中,誤將依賴數組又傳遞一次,那么A模塊原來的定義就會被覆蓋,並且原來A模塊定義的controller,service等組件也將不存在,這樣也會導致難以調試的問題。因此在定義和使用Angular模塊時不能大意。