javascript - 从 Controller 观察服务的变化

标签 javascript angularjs angularjs-scope

我正在尝试监听 Controller 中注入(inject)服务( self 更新)的变化。在下面的示例中,您会发现两种 $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;
    }
]);

Controller :

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');
        });
    }
]);

最佳答案

$watch见第三个参数: objectEquality

Compare object for equality rather than for reference.

但是,如果您只对观察返回的数据感兴趣,那么您应该这样做:

$scope.$watch('stats.data', function (stats) {
    return console.log('meh');
});

关于javascript - 从 Controller 观察服务的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360809/

相关文章:

angularjs - 在不重新加载 Controller 的情况下从解析函数访问数据

javascript - 将事件对象从指令传递到回调

javascript - 将数据传递给 Angular ui 模态(灯箱效果)

javascript - AngularJS $watch 不等待触发发生,执行回调函数内的 $scope

javascript - 如何在 php 变量中存储 javascript 函数值

javascript - AJAX请求JSON有两种方式

javascript - 仅当值较大时才更新 mongo 文档

javascript - Angularjs - 如果元素不存在则隐藏元素

jquery - Angularjs:jquery可选择子元素点击问题

javascript - 从模板调用函数的问题