javascript - Angular.js Service Factory module...return inner code as a function? -
i new angular.js. first service wrote. takes json object , updates scope of controller. i'm little confused on though...i think supposed wrap inner code of sselistener , return function, not sure how write , why need return function.
also, if inject service several controllers, multiply event listeners? want have 1 event listener.
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; } }); } one@demo ~/cloudimageshare-monitoring/project/app/scripts $ cat controllers/main.js 'use strict'; angular.module('monitorapp') .controller('homectrl', function($scope, $location, $document) { console.log("s"); }); angular.module('monitorapp') .controller('cpuctrl', function($scope) { $scope.apitimestamp = ""; $scope.inforeceived = ""; $scope.last15 = ""; $scope.last5 = ""; $scope.lastminute = ""; var cpuupdate = function (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 }); } });
instead of calling cpuupdate directly (it's not clear me how factory gets reference function), better use $rootscope.$broadcast(eventname, data), , react event in controller. also, should return object factories, since don't need inject anywhere, it's best put in app.run. here's how think code should changes mentioned:
angular.module('monitorapp'). run(function ($rootscope) { //inject $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 event data $rootscope.$broadcast('$cpuresult', result); break; } }); }). controller('cpuctrl', function($scope)){ $scope.apitimestamp = ""; $scope.inforeceived = ""; $scope.last15 = ""; $scope.last5 = ""; $scope.lastminute = ""; // need pass event 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 event, call cpuupdate when caught $scope.$on('$cpuresult', cpuupdate); });
Comments
Post a Comment