簡體   English   中英

AngularJS Factory $ rootScope。$ on cleanup

[英]AngularJS Factory $rootScope.$on Cleanup

如何從服務內部清理$ rootScope。$ on事件訂閱?

我有一個在我的AngularJS應用程序中的不同控制器中初始化的Factory,其中聲明了$ rootScope。$ on事件訂閱。 我的問題是,當控制器被銷毀時,事件不會被清除。 我已經完成閱讀並發現使用控制器和指令你可以在$ destroy上設置$ watch以進行清理,但是對於服務呢? 你如何清理服務?

這是我的問題的基本插件: http ://plnkr.co/edit/dY3BVW。 單擊“創建子項”按鈕一大堆時間來初始化一個子控制器,該控制器將使用$ rootScope。$ on初始化工廠。 當您單擊“廣播”時打開瀏覽器控制台,您將看到一系列事件訂閱被觸發,子控制器被銷毀后發生事件。

Plunker的片段:

// setup rootScope on in Factory and create multiple instances
// to show that event subscriptions are not cleaned up
// TODO: how do you cleanup in factory?
app.factory('HelloWorldFactory', function($rootScope) {

  // setup event subscription on initialization
  function HelloWorldFactory() {
    console.log('init helloWorldFactory');

    var rootScopeOn = $rootScope.$on('test', function() {
      console.log('test sub', Math.random());
    });
  }

  return HelloWorldFactory;
});

// child ctrl will init a new factory instance
app.controller('ChildCtrl', function($scope, HelloWorldFactory) {
  $scope.name = 'Child';

  var helloWolrdFactory = new HelloWorldFactory();
});

您可以在創建新事件之前終止哨兵。 創建新控制器后,rootScopeOn變量將保持不變,因此每次重新初始化時都可以將其刪除。

app.factory('HelloWorldFactory', function($rootScope) {

  var rootScopeOn;

  // setup event subscription on initialization
  function HelloWorldFactory() {
    console.log('init helloWorldFactory');
    if (typeof rootScopeOn === 'function') {
      rootScopeOn();
    }

    rootScopeOn = $rootScope.$on('test', function() {
      console.log('test sub', Math.random());
    });
  }

  return HelloWorldFactory;
});

// child ctrl will init a new factory instance
app.controller('ChildCtrl', function($scope, HelloWorldFactory) {
  $scope.name = 'Child';

  var helloWolrdFactory = new HelloWorldFactory($scope);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM