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