所以如果我的很多 Controller 都有这个:
$scope.error = false;
$scope.errorData = {};
$scope.working = false;
$scope.workingMessage = "Doing something, please wait..."; // best UI message ever
有没有办法在给我的 Controller 的每个 $scope
上永久定义这些?
所以我确实需要继承,那么在哪里可以将这些范围变量应用到 $rootScope
以便它能够在我的所有 Controller 中被拾取?
更新
因此,在阅读了大量文档后,似乎使用 ngApp
自动引导 Angular 应用程序,这是在 $injector
服务运行时。我需要在该服务运行之前设置变量,所以我猜测我需要手动引导应用程序。
更多工作
.run()
这在所有模块初始化后运行。所以在这里我可以注入(inject) $rootScope 并将我的变量放在上面。然后它们可以用在我所有的 $scope
上,显然,如果您将数据绑定(bind)到它,那么您可以简单地使用属性名称,因为绑定(bind)器将首先查看 $scope
然后是所有后续父作用域,直到找到该属性。
.run(['$rootScope', rootScopeConfigure]);
function rootScopeConfigure($rootScope) {
$rootScope.myCustomProperty = "Hey There";
}
根据对我的问题的评论,如果您随机添加属性,这可能会变得危险。但由于我只有几个属性,所以这并不重要,也不会增加那么多开销。 (我希望)。
然而,这一切都带来了一个问题,如果我想在 Controller
中修改这个自定义属性,那么我必须注入(inject)$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()
函数中执行此操作。基本上覆盖工厂以返回一个新的子作用域,其中包含我的属性:)。
最佳答案
是的,范围可以从父级继承。您可以为您的 Controller 创建一个父 Controller 。
作用域可以从父作用域继承,如下例所示:
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');
关于javascript - 定义永久$scope变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27404682/