1

我正在使用 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()。

我找不到这种突然的变化,因此想知道这种方法是否真的合适。您能否提出问题所在,或者建议在将不存在的模块注入主模块之前移除它们的可靠方法?

4

0 回答 0