1

コントローラーで注入されたサービス (自己更新) の変更をリッスンしようとしています。$watch以下の例では、2 つのケースを見つけることができます。2番目の例は正しい方法ですか? それはコードの重複ではありませんか?それを行う正しい方法は何ですか?

サービス:

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

2 に答える 2

2

の 3 番目のパラメーターを参照してください$watchobjectEquality

オブジェクトを参照ではなく等しいかどうか比較します。

ただし、返されたデータの監視のみに関心がある場合は、次のようにする必要があります。

$scope.$watch('stats.data', function (stats) {
    return console.log('meh');
});
于 2013-08-21T15:14:13.930 に答える
0

イベントを使用でき$rootScopeます。たとえば、サービス内でイベントをディスパッチ$rootScope.$broadcast("somethingFetched", data)し、コントローラーでキャッチできます$scope.$on("somethingFetched", function(event, data) { $scope.data = data })

詳細については、ドキュメントhttp://docs.angularjs.org/api/ng .$rootScope.Scopeを参照してください。

于 2013-08-21T15:17:58.447 に答える