2014-11-07 15 views
11

Tại sao tôi không thể xem một đối tượng trong một dịch vụ. Ive có một biến làm việc đơn giản, nhưng một đối tượng sẽ không hoạt động. http://plnkr.co/edit/S4b2g3baS7dwQt3t8XEK?p=previewĐối tượng dịch vụ xem Angularjs

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

thể trùng lặp của [$ xem một đối tượng trong góc] (http://stackoverflow.com/questions/19455501/watch-an-object -in-góc) – kvetis

+2

Tôi đề nghị bạn viết 'hàm() { return test.getData(); }, 'thay thế 'test.getData()'. Bằng cách này, bạn có thể tránh lỗi, vì góc không xác thực định nghĩa chuỗi. –

Trả lời

13

Bạn cần phải vượt qua sự thật như các tham số cuối cùng của hàm $ đồng hồ để kiểm tra sự bình đẳng là angular.equals. Nếu không, chỉ kiểm tra bình đẳng tham chiếu.

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

Duplicate câu hỏi: $watch an object

EDIT

Như dưới đây đề cập, mã bao gồm một thực tế xấu - có một dịch vụ được tham chiếu trong $scope. Không cần tham chiếu nó trong phạm vi, vì $watch cũng chấp nhận hàm getter làm đối số đầu tiên. Giải pháp làm sạch sử dụng chức năng này để trả về mảng đã xem như trong answer below. $scope.$watch(function() { return test.getData(); } ...

Để liệt kê giải pháp hoàn chỉnh, bạn cũng có thể sử dụng $watchCollection để giải quyết vấn đề kiểm tra bình đẳng tham chiếu.

+0

Cảm ơn! đã giúp tôi rất nhiều! –

19

tiêm toàn bộ dịch vụ vào phạm vi không phải là điều tôi sẽ làm.

Tôi muốn xem một hàm trả về giá trị:

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

Thực ra đây là cách duy nhất tôi có thể làm cho đồng hồ hoạt động khi xem một mảng thay vì một hàm (ví dụ: test.data). –

Các vấn đề liên quan