我正在使用 AngularJS v1.2.16
我有 3 个 Angular 项目,一个应用程序和 2 个组件,所有 3 个都是通过 requirejs 独立配置的。现在,让我来谈谈这三个项目的主要js文件。
app.js - 我的主要应用程序文件
var registeredDependencies = ['myapp.ctrls','myapp.services','myapp.commons','comp1.main','comp2.main'];
var buildValidDependencies = function() {
var validDependencies = angular.copy(registeredDependencies);
_.each(validDependencies, function(dep) {
try {
setTimeout(function() {
angular.module(dep);
});
} catch (e) {
var index = validDependencies.indexOf(dep);
validDependencies.splice(index, 1);
console.log("'" + dep + "' removed as it failed the existence test.");
}
});
return validDependencies;
};
angular.module('myapp.main', buildValidDependencies());
comp1.js - app.js 使用的小部件 1
angular.module('comp1.main', []);
comp2.js - app.js 使用的小部件 2
angular.module('comp2.main', []);
comp1 和 comp2 都使用 'myapp.commons' 但是它们没有显式注入 comp1.main 和 comp2.main 模块,因为我的应用程序的主模块 'myapp.main' 注入了所有 3 个模块 'myapp.commons','comp1.main ','comp2.main',因此 comp1 和 comp2 可以隐式使用 commons。我不想在 comp1 和 comp2 中注入 common 以避免在 3 个不同的地方为它们配置 requirejs。
现在真正的问题是...... comp1 和 comp2 是可选组件。如果在运行时不存在任何一个,我的应用程序应该仍在运行。为此,我的 buildValidDependencies() 函数在将模块注入我的应用程序的主模块之前验证它们是否存在。我希望 angular.module(dependency) 足以验证这一点。它在我的本地机器上运行良好,但在生产中失败,其中 comp1.js 和 comp2.js 是从 CDN 下载的。我观察到有一些时间问题,因此我将此代码包装在 setTimeout() 函数中。直到今天,这似乎已经成功了。但是我今天看到 angular.module(dep) 永远不会失败,即使相应的模块不存在,我发现这是因为 setTimeout()。
我找不到这种突然的变化,因此想知道这种方法是否真的合适。您能否提出问题所在,或者建议在将不存在的模块注入主模块之前移除它们的可靠方法?