我想要几个与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
指令根据表达式生成的角度生成的对象属性。
我做错了什么?
答案 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()
我认为这会使它更简洁易用和理解。