因此,如果我的很多控制器中都有这个:
$scope.error = false;
$scope.errorData = {};
$scope.working = false;
$scope.workingMessage = "Doing something, please wait..."; // best UI message ever
有没有办法在我的控制器的每个$scope
上永久定义这些?
所以我确实需要继承,那么在哪里可以将这些范围变量应用到$rootScope
,以便它可以在我的所有控制器中被拾取?
更新
因此,在阅读了大量文档之后,似乎使用ngApp
自动引导角度应用程序,即$injector
服务运行时。我需要在此服务运行之前设置变量,所以我猜我需要手动引导应用程序。
更多工作
.run()
在初始化所有模块后运行。所以在这里我可以注入$ rootScope并将我的变量放在那里。然后它们可以在我的所有$scope
上使用,显然如果您将数据绑定到它,那么您可以简单地使用属性名称,因为绑定器将首先查看$scope
然后查看所有后续父作用域,直到它找到了财产。
.run(['$rootScope', rootScopeConfigure]);
function rootScopeConfigure($rootScope) {
$rootScope.myCustomProperty = "Hey There";
}
根据对我的问题的评论,如果您随机添加属性,这可能会很危险。但由于我只有一些属性,因此无关紧要或增加很多开销。 (我希望)。
但是,所有这些都会带来一个问题,如果我想在controller
中修改此自定义属性,那么我必须注入$rootScope
。我不是特别想这样做,我希望能够在$scope
在回应我的上一段时,我应该能够$scope.$root.myCustomProperty
,因为我猜测$rootScope
是所有$scope
的根。
肮脏的回答
$rootScope.$oldNew = $rootScope.$new;
$rootScope.$new = function () {
var childScope = $rootScope.$oldNew();
childScope.myCustomerProp = "Hey There";
return childScope;
}
在run()
功能中执行此操作。基本上覆盖工厂以返回具有我的属性的新子范围:)。
答案 0 :(得分:1)
是的,范围可以从父母那里继承。您可以为控制器创建父控制器。
范围可以从父范围继承,如下例所示:
var parent = $rootScope;
var child = parent.$new();
parent.salutation = "Hello";
child.name = "World";
expect(child.salutation).toEqual('Hello');
child.salutation = "Welcome";
expect(child.salutation).toEqual('Welcome');
expect(parent.salutation).toEqual('Hello');
答案 1 :(得分:0)
所以我现在有了答案。
.run()
在初始化所有模块后运行。所以在这里我可以注入$rootScope
覆盖是$new
函数,我认为它只是一个简单的范围工厂。
然后,我的所有$scope
上都可以使用放在新范围内的任何属性或方法。
.run(['$rootScope', runtimeConfigure]);
function runtimeConfigure() {
$rootScope.$oldNew = $rootScope.$new;
$rootScope.$new = function(isolate, parent) {
var child = $rootScope.$oldNew(isolate, parent);
child.title = "Hey There";
return child;
}
}
我相信这样做没有问题。
首先,我只是重影原始范围工厂$new
其次,我只是在新范围中添加属性。
答案 2 :(得分:0)
我建议不要使用范围,而是使用$ cacheFactory或您自己的服务/工厂来保持这种状态。