我创建了一个隔离业务逻辑的服务,并将其注入到需要信息的控制器中.我最终要做的是让控制器能够观察服务中的值,以便我不需要进行广播/通知或复杂的消息传递解决方案,让所有的控制器被通知数据的更改服务.
我创建了一个plnkr,展示了我正在努力做什么的基本想法.
http://plnkr.co/edit/oL6AhHq2BBeGCLhAHX0K?p=preview
控制器是否可以监视服务的值?
你已经在做正确了即将服务推送到作用域变量中,然后将该服务作为范围变量的一部分进行观察.
原文链接:https://www.f2er.com/angularjs/143212.html这是您的工作解决方案:
http://plnkr.co/edit/SgA0ztPVPxTkA0wfS1HU?p=preview
HTML
<!doctype html> <html ng-app="plunker" > <head> <Meta charset="utf-8"> <title>AngularJS Plunker</title> <script>document.write('<base href="' + document.location + '" />');</script> <link rel="stylesheet" href="style.css"> <script src="http://code.angularjs.org/1.1.3/angular.js"></script> <script src="app.js"></script> </head> <body ng-controller="MainCtrl"> <button ng-click="start()">Start Count</button> <button ng-click="stop()">Stop Count</button> ControllerData: {{controllerData}} </body> </html>
Javascript:
var app = angular.module('plunker',[]); app.service('myService',function($rootScope) { var data = 0; var id = 0; var increment = function() { data = data + 1; $rootScope.$apply(); console.log("Incrementing data",data); }; this.start = function() { id = setInterval(increment,500) ; }; this.stop = function() { clearInterval(id); }; this.getData = function() { return data; }; }).controller('MainCtrl',function($scope,myService) { $scope.service = myService; $scope.controllerData = 0; $scope.start = function() { myService.start(); }; $scope.stop = function() { myService.stop(); }; $scope.$watch('service.getData()',function(newVal) { console.log("New Data",newVal); $scope.controllerData = newVal; }); });
以下是您错过的一些事情:
> $scope.$watch中的变量的顺序是错误的.它(newVal,oldVal)而不是其他方式.>因为你正在使用setInterval,这是一个异步操作,你必须让角度知道事情发生了变化.这就是为什么你需要$rootScope.$apply.>你不能看一个函数,但你可以看到函数返回的.