2013-08-21 2 views
1

J'essaie d'écouter les changements dans mon service injecté (mise à jour automatique) dans le contrôleur. Dans l'exemple ci-dessous, vous trouverez deux cas $watch - un qui fonctionne mais je ne sais pas exactement pourquoi et un qui était évident pour moi, mais ne fonctionne pas. Le deuxième exemple est-il la bonne façon de le faire? N'est-ce pas la duplication de code? Quelle est la bonne façon de le faire?Surveillance dans le service depuis le contrôleur

Service:

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

Répondre

2

Voir le troisième paramètre pour $watch: objectEquality

Comparer objet pour l'égalité plutôt que pour référence.

Toutefois, si vous êtes uniquement intéressé à regarder les données renvoyées, vous devez faire:

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

Vous pouvez utiliser $rootScope événements. Par exemple, à l'intérieur du service, vous pouvez envoyer un événement avec $rootScope.$broadcast("somethingFetched", data) et l'attraper dans le contrôleur $scope.$on("somethingFetched", function(event, data) { $scope.data = data }).

Plus de détails que vous pourriez trouver dans la documentation http://docs.angularjs.org/api/ng. $ RootScope.Scope

Questions connexes