我想知道AngularJS中是否存在用于创建存在于app模块中的对象的约定,但是没有以任何方式直接附加到视图,而是在视图加载并且应用程序启动时调用。特别是,我正在尝试编写一个对象,当它们从服务器进入时将消息发送给侦听控制器。
目前,我已经通过创建一个" Controller"附在视图上。它有一个monitor()
函数,在页面加载时调用,然后在循环中侦听任何传入的消息。我通过设置ng-controller来调用加载视图中的monitor()
函数:
<div ng-controller="MyController">
{{ monitor() }}
</div>
这并不是一件合适的事情。这个&#34;控制器&#34;我没有以任何方式与视图互动,所以我的直觉告诉我,我违反了AngularJS的原则。但是我还没有能够找到一个由AngularJS doc认可的简单解决方案。
我正在寻找一种方法来创建一个生活在AngularJS世界中的对象(换句话说,它可以使用依赖注入来访问服务,它可以使用$scope.$broadcast
向其他侦听控制器发送消息),但这并不需要以任何方式将自己附加到视图上。
理想情况下,我正在寻找一种方式来说,&#34;这里Angular,在启动时,创建这个对象,并在其上运行此方法。&#34;有没有办法做到这一点?
答案 0 :(得分: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
});
};
});
请注意,这是一个开始,没有任何生产代码。例如,控制器在被销毁后不会取消订阅 - 如果页面发生变化 - 那么你就会泄漏内存。
请勿在此
中使用$ broadcast-events2:如果此MessageBus有特定问题,那么应该是具有有意义名称和api的自己的对象。否则,当您的应用程序增长时,您的$ rootScope将充斥着不同事件的不同事件。服务总是更容易记录,并且您对该特定服务具有干净的依赖性。只有使用$ rootScope上的事件才会隐藏每个开发人员读取的依赖关系,并希望了解您的代码库,
答案 1 :(得分:1)
是的,你接近真的很臭。每次$apply/$digest
调用时都会调用此函数。
也许将函数移动到模块上的run
回调中。
var app = angular.module("YourApp", [//dependencies]);
app.run(function($YourUIService){
$YourUIService.monitor();
});
当您的angularjs-module加载了每个依赖项并准备好运行时,将调用run
。
未找到此文档:/