Angular模块的陷阱
当调用`angular.module`函数时,在第二个参数中是否指定数组会产生不同的意义。
- 第2引数に配列を指定する場合
// myModuleを新規に作成し、既存のmyModuleが存在した場合には、上書きする。
angular.module('myModule', []);
- 第2引数を指定しない場合
// 既存のmyModuleを取得する。
angular.module('myModule');
- 「第2引数を指定しない場合」のパターンでは、myModuleが存在していない場合に、次のようなエラーになる。
未捕获错误:[$injector:nomod] 模块’myModule’不可用!您可能拼写错误或忘记加载该模块。如果注册一个模块,请确保在第二个参数中指定依赖项。
陷阱
如果在设置模块的控制器时,采用了“在第二个参数中指定数组”的模式来获取模块,将会覆盖已存在的模块。
// myModuleモジュールを作成し、AControllerを設定する。
angular.module("myModule", []) .controller("AController", AController);
// myModuleモジュールを作成し、BControllerを設定する。既存のmyModuleは上書きされる。
angular.module("myModule", []) .controller("BController", BController);
当发生这种情况时,AController的设置会被覆盖并丢失,因此在使用AController的地方会出现以下错误。
错误:[ng:areq]参数 ‘AController’ 不是一个函数,得到了未定义。
如果要多次调用模块,则只需首次使用“在第二个参数中指定数组”的模式创建新模块,并在第二次以后使用“不指定第二个参数”的模式获取模块。
// myModuleの新規作成
angular.module("myModule", []);
// 既存のmyModuleにコントローラを設定
angular.module("myModule") .controller("AController", AController);
// 既存のmyModuleにコントローラを設定
angular.module("myModule") .controller("BController", BController);
// AController と BController を使用可能
请参考AngularJS官方文档中的「创建与检索」部分来描述规范。