我正在尝试监视控制器中服务的更改。我在这里基于stackoverflow的许多qns尝试了各种方法,但是我一直无法使其工作。
的HTML:
<div ng-app="myApp"> <div ng-controller="MyCtrl"> <div ng-click="setFTag()">Click Me</div> </div> </div>
javascript:
var myApp = angular.module('myApp',[]); myApp.service('myService', function() { this.tags = { a: true, b: true }; this.setFalseTag = function() { alert("Within myService->setFalseTag"); this.tags.a = false; this.tags.b = false; //how do I get the watch in MyCtrl to be triggered? }; }); myApp.controller('MyCtrl', function($scope, myService) { $scope.setFTag = function() { alert("Within MyCtrl->setFTag"); myService.setFalseTag(); }; $scope.$watch(myService.tags, function(newVal, oldVal) { alert("Inside watch"); console.log(newVal); console.log(oldVal); }, true); });
如何使手表在控制器中触发?
jsfiddle
尝试$watch通过这种方式写:
$watch
myApp.controller('MyCtrl', function($scope, myService) { $scope.setFTag = function() { myService.setFalseTag(); }; $scope.$watch(function () { return myService.tags; }, function(newVal, oldVal) { /*...*/ }, true); });
演示版 **[Fiddle](http://jsfiddle.net/b3A8B/5/)**
**[Fiddle](http://jsfiddle.net/b3A8B/5/)**
[编辑]
有时,这种方式将不起作用,特别是如果服务已从3d party更新。
为了使其工作,我们必须 帮助 调整点火消化周期。
这是一个例子:
在服务端,当我们想要更新tags值时,请输入以下内容:
tags
if($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest'){ $rootScope.$apply(function() { self.tags = true; }); } else { self.tags = true; }