繁体   English   中英

装饰和访问$ rootScope方法

[英]decorating and accessing $rootScope method

我已经用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 请在评论中看到它。 因此,它不是在修饰方法,而是增加了可跨(指令范围,控制器范围)访问的功能。

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

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

装饰器的灵感来自装饰器模式面向方面的编程

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

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

DEMO

我们也可以使用decorator来做类似的事情,但是感觉这不是正确的方法,因为decorator的想法是创建包装器

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

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

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM