定义永久$ scope变量

时间:2014-12-10 15:24:55

标签: javascript angularjs

因此,如果我的很多控制器中都有这个:

$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()功能中执行此操作。基本上覆盖工厂以返回具有我的属性的新子范围:)。

3 个答案:

答案 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');

https://docs.angularjs.org/api/ng/type/$rootScope.Scope

答案 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或您自己的服务/工厂来保持这种状态。