【问题标题】:decorating and accessing $rootScope method装饰和访问 $rootScope 方法
【发布时间】:2014-02-14 12:34:35
【问题描述】:

我在模块配置中使用 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 。请在评论中查看。因此,它不是装饰方法,而是添加可跨(指令范围、控制器)访问的功能

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    装饰器应该与服务一起使用,而不是作用域。

    装饰器是一种允许使用包装原始服务并执行横切关注点的机制,例如:缓存、日志记录……以及保持服务不变以专注于其业务不会被这些代码污染

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

    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 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

    【讨论】:

    • 谢谢。请参阅我的编辑以解释动机。我其实是用你的方法来装饰$exceptionHandler的。但在这种情况下,更多的是向所有范围添加一个功能。
    • @bsr: 如果你想给所有作用域添加一个函数,只要把它添加到rootScope,所有作用域都会继承这个函数。
    • 谢谢.. 在哪里/如何做。我在基本控制器中尝试过,但是指令范围看不到它。我认为可以在配置中完成。
    • @bsr:我在回答中添加了更多信息。我们还可以利用装饰器向 $rootScope 添加一个方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2011-10-30
    • 2011-06-26
    • 2014-09-26
    相关资源
    最近更新 更多