设置初始$ rootScope默认值似乎不起作用

时间:2014-01-08 01:30:34

标签: angularjs extend rootscope

我想要几个与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指令根据表达式生成的角度生成的对象属性。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

已解决 - 模块被覆盖

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

我按此顺序加载文件:

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

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

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

可能的解决方法

我可以看到,我不是唯一一个喜欢这种功能的人。根据{{​​3}},可以加载Lasy模块要求。

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

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

以后可以由各个模块用来将自己作为需求添加到主应用程序模块中:

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

虽然如果在名为Module的{​​{1}}类型上有一个额外的功能会更好(我的意见),所以可以这样做:

requires()

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