范围的装饰者

时间:2013-05-17 06:32:12

标签: angularjs angularjs-scope

是否有可能,如果是这样,如何装饰$scope以便所有范围都有一些额外的功能/属性?

我正在尝试这样做:

$provide.decorator('$scope', function($scope)
{
    $scope.cakes = true;
    return $scope;
});

但它爆炸了:

  

来自App。

的未知提供商:$scopeProvider

知道我可以向$rootScope添加属性和函数,它将原型继承,但我希望指令中的隔离范围也可以访问这些添加的内容。

2 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。

只需扩展$ rootScope原型。 然后,孤立的范围也将采用这种方法。

这是我尝试使用lodash去抖功能作为原生范围方法:

angular.module('Test', [])
.config(function($provide) {
    $provide.decorator('$rootScope', function ($delegate) {
        $delegate.__proto__.$$busy = 0;
        $delegate.__proto__.$watchDebounce = function (watchExpression, listener, objectEquality){
            var _scope = this;
            var debouncedListener = _.debounce(function (newValue, oldValue, scope){
                listener(newValue, oldValue, scope);
                _scope.$$busy = 0;
                scope.$digest();
            }, 1000);

            var wrappedListener = function (newValue, oldValue, scope){
                _scope.$$busy = 1;
                debouncedListener(newValue, oldValue, scope);
            }

            return this.$watch(watchExpression, wrappedListener, objectEquality);
        }
        return $delegate;
    })
})

此处的工作示例http://jsfiddle.net/3ncct/

答案 1 :(得分:0)

这似乎不可能,但我会说这是 isolate 范围的重点。

你可以做的是通过scope.$root访问装饰的东西,但是对于许多用例,它会失败,因为添加的功能仍然只能访问$rootScope而不是孤立的。{/ p>