测试是否已创建angularjs模块

时间:2014-12-21 20:06:11

标签: angularjs

我想测试一个模块是否已经创建。是否可以使用如下所示的简单代码进行检查?

if(angular.module('myApp') == undefined){
  angular.module('myApp', ['ngRoute']); 
}

3 个答案:

答案 0 :(得分:1)

不,这并不容易。如果使用单个参数调用angular.module - 模块的名称 - 它总是抛出一个错误,除非模块已经存在(source):

if (!requires) {
  throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
     "the module name or forgot to load it. If registering a module ensure that you " +
     "specify the dependencies as the second argument.", name);
}

这一点与其他语言的import子句大致相同:如果你导入一个模块(很可能是另一个模块的依赖关系)并且它还没有,那就是一个严重的错误 - 一个类型的显示停止因此是一个错误(而不只是返回null或其他东西)。

并且没有简单的方法来访问模块列表:它存储在moduleLoader的本地变量中。因此,解决此问题的一种可能方法是将检查包装在try-catch

function isModuleRegistered(moduleName) {
  var isThere = true;
  try {
    angular.module(moduleName);
  }
  catch {
    isThere = false;
  }
  return isThere;
}

仍然我不得不说如果需要这样的技巧,那就是代码味道。 Angular有一个很好的(不完美但很好的)依赖注入系统,并且将它与不同的加载器(例如RequireJS)结合起来并不困难。如果你需要手动检查一个模块是否还在那里,那么很可能还有一个缺点就是等着咬你。 )

我能想到的唯一例外是可以使用单个接口的不同实现的系统 - 并且需要检查提供哪个;但话又说回来,这在配置级别上更容易解决。

答案 1 :(得分:0)

更好的方法可以使用try catch block

try {
 var myApp= angular.module("myApp") ;

} 
catch(err) 
{ 
angular.module('myApp', ['ngRoute']);
}

答案 2 :(得分:0)

以下对我有用 - 然后如果文件被插入到主index.html文件中两次 - 角度模块只会被创建一次。

var myApp = myApp;
if (!myApp) {
  myApp = angular.module('myApp', []);
}