2013-08-01 28 views
10

Tôi đang gặp sự cố khi xem đồng hồ hoạt động trong chỉ thị. Tôi đã đặt cùng một ví dụ đơn giản ở đây. http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2PGiá trị thay đổi trên Dịch vụ AngularJS không kích hoạt đồng hồ trong chỉ thị

Tôi có một dịch vụ và hai chỉ thị. Một chỉ thị thay đổi một thuộc tính trong dịch vụ và một chỉ thị khác có một chiếc đồng hồ trên thuộc tính đó. Tôi hy vọng chiếc đồng hồ sẽ cháy khi tài sản bị thay đổi nhưng nó không.

Tôi đã nhìn thấy một vài câu hỏi khác như thế này trên trang web, nhưng các giải pháp được chấp nhận trên chúng chưa hoạt động ở đây. Tôi đã xem xét sử dụng $ phát sóng hoặc cố gắng thực hiện một người quan sát, nhưng có vẻ như điều này sẽ hiệu quả và tôi không muốn làm mọi thứ phức tạp hơn nếu có thể.

Trả lời

5

Thay vì

this.currentObject = newObject; 

sử dụng

angular.copy(newObject, this.currentObject); 

Với mã gốc, chỉ thị viewer đang theo dõi các đối tượng gốc, {}. Khi currentObject được đặt thành newObject, đồng hồ $ vẫn đang tìm kiếm thay đổi đối với đối tượng gốc, không phải là newObject.

angular.copy() sửa đổi đối tượng gốc, vì vậy đồng hồ $ thấy thay đổi đó.

+0

Cảm ơn, tôi biết nó có thể là một cái gì đó đơn giản. Một chủ đề khác đã đề cập rằng việc chuyển thuộc tính thứ ba của đồng hồ là đúng sẽ xử lý điều đó, vì vậy tôi đã ngừng điều tra tuyến đường đó. –

28

Câu trả lời của Mark Rajcok chưa hoàn thành. Ngay cả với angular.copy(), $ watch listener sẽ được gọi một lần và không bao giờ trở lại.

Bạn cần phải $ xem một hàm:

$scope.$watch(

    // This is the important part 
    function() { 
    return demoService.currentObject; 
    }, 

    function(newValue, oldValue) { 
    console.log('demoService.currentObject has been changed'); 
    // Do whatever you want with demoService.currenctObject 
    }, 
    true 
); 

Ở đây plunker rằng hoạt động: http://plnkr.co/edit/0mav32?p=preview

Mở giao diện điều khiển trình duyệt của bạn để thấy rằng cả hai chỉ thị và demoService2 được thông báo về những thay đổi demoService.currentObject .

Và btw angular.copy() thậm chí không cần thiết trong ví dụ này.

+2

Câu trả lời hoàn hảo. Đây là cách thích hợp để làm điều đó. – krosullivan

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