2014-11-07 38 views
11

izle. Basit bir değişken çalışıyor, ancak bir nesne işe yaramıyor. http://plnkr.co/edit/S4b2g3baS7dwQt3t8XEK?p=previewangularjs hizmet nesnesi

var app = angular.module('plunker', []); 

app.service('test', ['$http', '$rootScope', 
      function ($http, $rootScope) { 

    var data = 0; 
    var obj = { 
       "data": 0 
       }; 

    this.add = function(){ 
    obj.data += 1; 
    console.log('data:', obj); 
    }; 

    this.getData  = function() { return obj; }; 

}]); 

app.controller('TestController', ['$scope', '$rootScope', '$filter', 'test', 
          function($scope, $rootScope, $filter, test) { 

    //test controller 
    $scope.add = function(){ 
    test.add(); 
    }; 
    $scope.test = test; 
    $scope.$watch('test.getData()', function(newVal){ 
    console.log('data changes into: ', newVal) 
    }); 
}]); 
+1

olası yinelenen [$ açısal bir nesneyi izlemek] (http://stackoverflow.com/questions/19455501/watch-an-object -in-açısal) – kvetis

+2

size() { dönüş test.getData() 'işlevi yazmak göstermektedir; }, 'yerine 'test.getData()'. Böylelikle hatalardan kaçınabilirsiniz, çünkü açısal dize tanımını doğrulamaz. –

cevap

13

Sen eşitlik onay angular.equals olacak şekilde $ izle fonksiyonunun son parametresi olarak gerçek geçmesi gerekiyor. Aksi takdirde sadece referans eşitliği kontrol edilir.

$scope.$watch('test.getData()', function(newVal){ 
    console.log('data changes into: ', newVal) 
}, true); 

Aynı sorular: - $scope başvurulan bir hizmeti olan $watch an object

DÜZENLEME söz feryat olarak

, kod kötü uygulama içermektedir. $watch birinci değişken olarak bir alıcı işlevi kabul beri kapsamına referans olarak kullanmak için gerekli değildir. Temiz solüsyon answer below olduğu gibi izlenen dizi dönmek için bu fonksiyonu kullanır. $scope.$watch(function() { return test.getData(); } ...

Tam bir çözüm listelemek için, başvuru eşitliği denetim problemini çözmek yerine $watchCollection'u da kullanabilirsiniz. Bir kapsam içine bütün hizmetlerini enjekte

+0

Teşekkürler! bana çok yardım etti! –

19

ben yapacağı bir şey değildir.

ben değerini döndüren bir işlevi izlemeyi tercih ediyorum: içinde

$scope.$watch(function() { return test.getData(); }, function(newVal) { 
    /* Do the stuff */ 
}, true); 
+4

Aslında bu bir işlevi yerine bir dizi (örneğin test.data) izlerken işe bir saat al edebildi tek yoludur. –