2014-04-30 62 views
0

我想知道AngularJS中是否存在一個約定,用於創建一個對象,該對象位於應用程序模塊內,但並不以任何方式直接附加到視圖,而是在視圖已經加載,應用程序啓動。特別是,我試圖編寫一個對象,當它們從服務器進入時,將消息分派給監聽控制器。

目前,我通過創建一個附加到視圖的「控制器」來實現此目的。它有一個monitor()函數,在頁面加載時調用,然後在循環中偵聽任何傳入消息。我所說的monitor()函數從加載的視圖中,通過設置NG控制器像這樣:創建AngularJS對象,調用應用程序加載方法

<div ng-controller="MyController"> 
{{ monitor() }} 
</div> 

這並不覺得自己做了正確的事情。這個「控制器」並沒有以任何方式與視圖進行交互,所以我的直覺告訴我,我違反了AngularJS的原則。但是我還沒有能夠找到一個由AngularJS doc支持的簡單解決方案。

我正在尋找一種方法來創建一個生活在AngularJS世界中的對象(換句話說,它可以使用依賴注入來訪問服務,並且它可以使用$scope.$broadcast向其他監聽控制器發送消息),但不需要以任何方式將自己固定在視圖上。


理想情況下,我正在尋找一種方法來說,「這裏Angular在啓動時創建此對象,並在其上運行此方法。」有沒有辦法做到這一點?

回答

2

您可以使用此作爲起點:

你的對象的聲明。

AngularJS: Service vs provider vs factory

myApp.factory('MessageBus', function() { 
    return { 
     listeners: [], 
     init: function() { 
      // do whatever you need at startup 
     }, 
     pushMessage: function(msg) { 
      angular.forEach(this.listeners, function(listener) { 
       listener(msg); 
      }); 
     }, 
     subscribe: function(onMessageCallback) { 
      this.listeners.push(onMessageCallback); 
     } 
    }; 
}); 

調用角appilcation的方法使用的控制器內該對象開始

https://docs.angularjs.org/api/ng/type/angular.Module#run

myApp.run(function(MessageBus) { 
    MessageBus.init(); 
}); 

https://docs.angularjs.org/guide/di

myApp.controller('MessageCtrl', function($scope, MessageBus) { 
    $scope.messagesToShow = []; 
    MessageBus.subscribe(function(message) { 
      $scope.messagesToShow.push(message); 
    }); 
    $scope.submitMessage = function(id, text) { 
      MessageBus.pushMessage({ 
       type: 'TEXTMESSAGE', 
       id: id, 
       payload: text 
      }); 
    }; 
}); 

注意,這是值得入手,並沒有任何的產品代碼。例如,控制器在被銷燬後不會取消訂閱 - 如果頁面更改 - 並且會泄漏內存。

不要使用$廣播事件這一

1:they are slow

2:如果這MessageBus有特定的關注,比應爲自己的對象與meaningfull名稱和API 。否則,當您的應用程序增長時,您的$ rootScope將充斥着不同事件的不同事件。服務總是比較容易記錄,並且您對該特定服務具有乾淨的依賴性。只有使用$ rootScope上的事件才能隱藏每個開發人員閱讀的依賴關係,並希望瞭解您的代碼庫,

1

是的,你的做法真的很臭。每次調用$apply/$digest時都會調用該函數。

也許將函數移動到模塊上的run回調。

var app = angular.module("YourApp", [//dependencies]); 

app.run(function($YourUIService){ 
$YourUIService.monitor(); 
}); 

run將被調用,當你angularjs模塊加載每個依賴,並準備運行。

沒有發現這個文檔:/

+0

有記錄[** HERE **](https://docs.angularjs.org/api/ng/type/angular .Module#運行) – jshanley

相關問題