装饰和访问$ rootScope方法

时间:2014-02-14 12:34:35

标签: javascript angularjs

我在模块的配置中用fn safeApply修饰了$ rootScope。

$provide.decorator('$rootScope', ['$delegate', function($delegate) {
        $delegate.safeApply = function(fn) {
           ...
         };
         return $delegate;
         }
]);

可以像

那样访问它
 $scope.$root.safeApply();

或者我需要注入$rootScope然后调用它。

我可以将此方法添加到$rootScope的原型中,以便它将继承所有$scope吗?怎么做。

修改

根据khanh的回复,我可能会添加更多信息。 safeApply是一种用于手动触发摘要周期的方法。装饰$ rootScope的想法是从https://coderwall.com/p/ngisma开始的。请在评论中看到它。因此,它不是在修饰方法,而是添加一个可以跨越(指令范围,控制器)

访问的功能

1 个答案:

答案 0 :(得分:2)

装饰器应该与服务而不是范围一起使用。

Decorator是一种机制,允许用于打包原始服务,并执行交叉问题,如:缓存,日志记录,以及保持服务完整以关注这些代码没有被污染的业务。

我会像这样实现装饰器。比方说,我们在另一个模块中定义了一个服务:

var lib = angular.module("lib",[]);
lib.service("util",function(){
     this.saveFile = function(file){
       console.log("save file:" + file);
     }
});

我们需要使用此服务并使用我们的代码对其进行修饰以进行一些日志记录,而不会使用日志记录逻辑来污染服务:

app.config(function($provide) {
  $provide.decorator('util', function($delegate) {

    var originalSaveFile = $delegate.saveFile;

    $delegate.saveFile = function(file){
       console.log("before save file");
       originalSaveFile.apply(this,arguments);
       console.log("after save file");
    }

    return $delegate;
  });
});

DEMO

Decorator受到decorator patternaspect oriented programming

的启发

在你的情况下,你可以在模块的运行块中将函数添加到$ rootScope,所有作用域都将继承该函数。

app.run(function($rootScope){
  $rootScope.safeApply = function(fn){
      console.log("safeApply");
  };
});

DEMO

我们也可以使用装饰器做这样的事情,但感觉它不是正确的方式,因为装饰器的想法是创建包装

$provide.decorator('$rootScope', function($delegate) {

    $delegate.safeApply = function(fn){
      console.log("safe apply");
    }
    return $delegate;
  });

DEMO