Javascript Angular.js服务工厂模块…是否将内部代码作为函数返回?
我是angular.js的新手。这是我写的第一个服务。它接受一个json对象并更新控制器的作用域。不过我有点困惑…我想我应该包装SSEStener的内部代码并将其作为函数返回,但我不确定我将如何编写它,以及为什么需要将其作为函数返回 另外,如果我将此服务注入多个控制器,会增加事件侦听器吗?我只想要一个事件侦听器Javascript Angular.js服务工厂模块…是否将内部代码作为函数返回?,javascript,angularjs,Javascript,Angularjs,我是angular.js的新手。这是我写的第一个服务。它接受一个json对象并更新控制器的作用域。不过我有点困惑…我想我应该包装SSEStener的内部代码并将其作为函数返回,但我不确定我将如何编写它,以及为什么需要将其作为函数返回 另外,如果我将此服务注入多个控制器,会增加事件侦听器吗?我只想要一个事件侦听器 one@demo ~/cloudimageshare-monitoring/project/app/scripts $ cat services/sse_listen.js angul
one@demo ~/cloudimageshare-monitoring/project/app/scripts $ cat services/sse_listen.js
angular.module('monitorApp')
.factory('sseListener', function () {
var source = new EventSource('/subscribe');
source.addEventListener('message', function(e) {
var result = JSON.parse(e.data);
event = Object.keys(result)[0];
switch(event) {
case "cpuResult":
cpuUpdate(result);
break;
}
});
}
与其直接调用cpuUpdate(我不清楚您的工厂如何获得此函数的引用),不如使用$rootScope.$broadcast(eventName,data),并对控制器中的事件做出反应。此外,您应该从工厂返回一个对象,但由于您不需要将其注入任何地方,因此最好将其放入app.run。下面是我认为您的代码应该如何处理我提到的更改:
angular.module('monitorApp').
run(function ($rootScope) { //Inject the $rootScope
var source = new EventSource('/subscribe');
source.addEventListener('message', function(e) {
var result = JSON.parse(e.data);
event = Object.keys(result)[0];
switch(event) {
case "cpuResult":
// Broadcast the event with data
$rootScope.$broadcast('$cpuResult', result);
break;
}
});
}).
controller('cpuCtrl', function($scope)){
$scope.apiTimeStamp = "";
$scope.infoReceived = "";
$scope.last15 = "";
$scope.last5 = "";
$scope.lastMinute = "";
// Need to pass the event to cpuUpdate,
var cpuUpdate = function (e, result) {
$scope.$apply(function(){
$scope.apiTimeStamp = result.cpuResult.timestamp;
$scope.infoReceived = new Date();
$scope.last15 = result.cpuResult.metrics['1m'].data
$scope.last5 = result.cpuResult.metrics['5m'].data
$scope.lastMinute = result.cpuResult.metrics['15'].data
});
};
//Listen for the event, call cpuUpdate when caught
$scope.$on('$cpuResult', cpuUpdate);
});
这是从我的工厂退回一件物品吗?我在sseListenerWhoops中没有看到返回函数名,我忘记了那个部分,我会修复它。哦…好的…我不想返回
var source=new EventSource('/subscribe')
source.addEventListener('message',function(e){}
?如果否,原因是什么?您只需要返回一个对象,该对象公开您希望通过注入工厂访问的成员。您可能希望返回{'source':source}因此,您可以检查事件侦听器的状态。事实上,仔细想想,由于您没有在任何地方注入此代码,我认为最好将此代码放在app.run中,而不是放在工厂中。我已相应地修改了代码。
angular.module('monitorApp').
run(function ($rootScope) { //Inject the $rootScope
var source = new EventSource('/subscribe');
source.addEventListener('message', function(e) {
var result = JSON.parse(e.data);
event = Object.keys(result)[0];
switch(event) {
case "cpuResult":
// Broadcast the event with data
$rootScope.$broadcast('$cpuResult', result);
break;
}
});
}).
controller('cpuCtrl', function($scope)){
$scope.apiTimeStamp = "";
$scope.infoReceived = "";
$scope.last15 = "";
$scope.last5 = "";
$scope.lastMinute = "";
// Need to pass the event to cpuUpdate,
var cpuUpdate = function (e, result) {
$scope.$apply(function(){
$scope.apiTimeStamp = result.cpuResult.timestamp;
$scope.infoReceived = new Date();
$scope.last15 = result.cpuResult.metrics['1m'].data
$scope.last5 = result.cpuResult.metrics['5m'].data
$scope.lastMinute = result.cpuResult.metrics['15'].data
});
};
//Listen for the event, call cpuUpdate when caught
$scope.$on('$cpuResult', cpuUpdate);
});