我正在尝试收听控制器中注入的服务(自我更新)的更改。在下面的示例中,您将找到两个$watch
个案例 - 一个有效,但我不确切知道为什么,一个对我来说很明显,但不起作用。第二个例子是正确的方法吗?那不是代码重复吗?什么是正确的方法?
服务:
app.factory("StatsService", [
'$timeout', 'MockDataService',
function ($timeout, MockDataService) {
var service, timeout;
timeout = 5000;
service = {
fetch: function () {
// Getting sample data, irrelevant, however this is what updates the data
return this.data = MockDataService.shuffle();
},
grab: function () {
this.fetch();
return this.update();
},
update: function () {
var _this = this;
return $timeout(function () {
return _this.grab();
}, timeout);
}
};
service.grab();
return service;
}
]);
控制器:
app.controller("StatsController", [
'$scope', 'StatsService',
function ($scope, StatsService) {
var chart;
$scope.stats = StatsService;
$scope.test = function (newValue) {
if (arguments.length === 0) {
return StatsService.data;
}
return StatsService.data = newValue;
};
// This doesn't work
$scope.$watch('stats', function (stats) {
return console.log('meh');
});
// This works, don't know why
$scope.$watch('test()', function (stats) {
return console.log('changed');
});
}
]);
答案 0 :(得分:2)
请参阅$watch
的第三个参数:objectEquality
比较对象是否相等而不是参考。
但是,如果您只对观察返回的数据感兴趣,那么您应该这样做:
$scope.$watch('stats.data', function (stats) {
return console.log('meh');
});
答案 1 :(得分:0)
您可以使用$rootScope
个活动。例如,在服务中,您可以使用$rootScope.$broadcast("somethingFetched", data)
调度事件并在控制器$scope.$on("somethingFetched", function(event, data) { $scope.data = data })
中捕获它。
您可以在文档http://docs.angularjs.org/api/ng中找到更多详细信息。$ rootScope.Scope