4

我希望很少有与 UI 相关的全局变量(即打开菜单状态)。我决定把它们放进去,$rootScope这样它们总是可以访问的。

这是我写的代码:

(function (angular) {

    angular
        .module("App", [])
        .run(["$rootScope", function ($rootScope) {
            angular.extend($rootScope, {
                ui: {
                    menu: false,
                    ...
                }
            });
        }]);

})(angular);

我故意使用angular.extend, 以确保保留对同一对象的连续操作。而且我认为它也比为任何对象一个一个地添加多个属性更干净和安全。

问题

上面的代码没有做任何事情。当我运行我的应用程序并通过调用检查根范围时:

$("body").scope().$root.ui

我得到undefined直到其中的某些属性被我的应用程序上的指令ui操纵。ng-click只有这样我才能ui得到一个引用......但它仍然不是我在run()函数中定义的那个,而是ng-click指令根据表达式生成的角度生成的对象属性。

我究竟做错了什么?

4

1 回答 1

0

已解决 - 模块被覆盖

Ia 自己设法解决了这个问题。上一个问题中包含的代码不足以显示我的应用程序中的实际问题。问题是我加载模块要求和文件排序的方式。

我按以下顺序加载文件:

app.js
routing.js
service.something.js
...
filter.something.js
...

所以我想在后续文件中将模块要求添加到我的应用程序模块中(使 ti 实际上模块化)。这将使包含或排除特定文件变得简单,而不会出现任何运行时错误。它还允许在应用程序运行时动态加载其他文件。

我的代码的问题是我在后续文件中覆盖了我的原始模块。当我将所有模块要求添加到app.js所有内容中时,一切都开始工作了。

可能的解决方法

我可以看到我不是唯一想要这种功能的人。根据此 Google 群组的帖子,可以加载 Lay 模块需求。

它的作用是创建一个新的注入器功能

instanceInjector.loadNewModules = function (mods) {
    forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); });
};

稍后可以由各个模块使用,通过执行以下操作将自己作为要求添加到主应用程序模块:

$injector.loadNewModules(["Module1", "Module2", ...]);

Module虽然如果在类型上有一个额外的函数调用会更好(我的观点),requires()所以可以这样做:

angular.module("MainModule").requires(["AdditionalModule", "OtherModule", ...]);

我认为这会使它更简洁,更易于使用和理解。

于 2014-01-08T02:28:49.743 回答