观察来自控制器的服务已更改

时间:2013-08-21 14:54:53

标签: javascript angularjs angularjs-scope

我正在尝试收听控制器中注入的服务(自我更新)的更改。在下面的示例中,您将找到两个$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');
        });
    }
]);

2 个答案:

答案 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