范围的装饰者

Dun*_*son 4 angularjs angularjs-scope

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

我正在尝试这样做:

$provide.decorator('$scope', function($scope)
{
    $scope.cakes = true;
    return $scope;
});
Run Code Online (Sandbox Code Playgroud)

但它爆炸了:

未知提供商:$scopeProvider来自App.

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

小智 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;
    })
})
Run Code Online (Sandbox Code Playgroud)

这里的工作示例http://jsfiddle.net/3ncct/

  • 好黑魔法!有用!请注意其他人:在我的实际应用程序中使用`$ provide.decorator('$ rootScope',...)`导致异常异常(尽管jsfiddle工作),但使用`app.run(function($ rootScope){ ......})`工作.如果需要,您也可以使用`Object.getPrototypeOf(...)`而不是`__proto__`. (2认同)