2014-04-30 34 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

相关问题