2015-03-17 17 views
5

Tôi tính toán một số tiện ích và biểu thức $watch hoạt động hoàn hảo với tất cả trong một tệp nhưng bây giờ tôi đã chuyển phần bộ điều khiển có liên quan vào bộ điều khiển mới và đánh dấu vào một html mới và các vụ cháy $watch chính xác một lần sau khi khởi tạo nhưng không chỉnh sửa gõ trong đầu vào liên quan.

JS:

app.controller('getRecipientWidgetController', [ '$scope', function($scope) { 
    console.log("controller initializing") 
    var testReceivingAddress = function(input) { 
     console.log("change detected") 
    } 
    $scope.$watch("addressInput", testReceivingAddress) 
} ]) 

HTML của wrapper:

<ng-include 
    src="'partials/getRecipientWidget.html'" 
    ng-controller="getRecipientWidgetController" 
    ng-init="recipient=cert"> <!-- ng-init doesn't influence the bug. --> 
</ng-include> 

HTML của partials/getRecipientWidget.html:

<md-text-float ng-model="addressInput"></md-text-float> 

tôi nghi ngờ có một số voodoo phạm vi xảy ra? Tôi rời khỏi ng-init để làm rõ những gì tôi muốn đạt được: xây dựng một widget rõ ràng phức tạp hơn, có thể sử dụng lại trong trường hợp này sẽ hoạt động trên $scope.certrecipient của nó.

+0

Chỉ cần cho tiếng cười khúc khích, những gì xảy ra khi bạn tiêm rootscope và gọi $ xem trên đó? – lintmouse

+0

@dustmouse không thay đổi. Chính xác cùng một lỗi/hành vi. – Giszmo

+0

Như đã nói bởi floribon trong câu trả lời của mình, tìm hiểu về cái gọi là "quy tắc chấm". – Blackhole

Trả lời

7

Đó có lẽ vì ng-include sẽ tạo ra một phạm vi di truyền mới trên HTML bao gồm, do đó $scope.addressInput trong điều khiển của bạn không phải là tài liệu tham khảo tương tự như $scope.addressInput trong getRecipientWidget.html

Vâng nó không phải dễ dàng để giải thích, nhưng bạn có nên đặt ng-controller trong HTML của getRecipientWidget.html (chứ không phải trên div ở trên bao gồm nó), HOẶC bạn có thể sử dụng một đối tượng chẳng hạn như something.addressInput thay vì addressInput thô giúp tránh các vấn đề tham chiếu trên các loại thô (số/chuỗi).

+0

Vâng! Cảm ơn bạn một tấn! 'something' bắt đầu làm việc ở đây. :) Không chắc chắn các giải pháp của bạn để chọn nhưng có sự lựa chọn là một vấn đề đẹp hơn để có hơn lỗi của tôi :) – Giszmo

+0

Chọn thứ hai. Sử dụng ký hiệu dấu chấm được xem là thực hành tốt nhất trong AngularJS, và làm điều này một cách nhất quán có nghĩa là bạn sẽ không có lỗi này trở lại để cắn bạn (hoặc đồng nghiệp của bạn sẽ thay đổi HTML) – Greg

+0

Tôi vừa thử nghiệm đầu tiên và học được (bạn có thể xây dựng/thêm rằng để trả lời của bạn) rằng cả hai bộ điều khiển đã kết thúc hoạt động trên cùng một phạm vi. Sẽ đi với 'cái gì đó 'và hai phạm vi (?). – Giszmo

3

ng-include tạo phạm vi mới.

Hãy thử điều này

<md-text-float ng-model="$parent.addressInput"></md-text-float> 

Plunker example

+0

Cảm ơn bạn nhưng tôi đoán floribon đã làm tốt công việc giải thích những gì đang xảy ra. Sử dụng '$ parent' sẽ là một lựa chọn thứ ba. – Giszmo

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