2013-06-19 23 views
15

Tôi cần sử dụng chỉ thị sublist ở một vài nơi trên trang và đôi khi phải có danh sách đầy đủ fields nhưng đôi khi được lọc. Dưới đây là cách tiếp cận ngây thơ của tôi:Bộ lọc thông qua angular.js để chỉ thị thuộc tính hai hướng ('=')

HTML:

<div ng-controller="MainCtrl"> 
     <sublist fields="fields" /> <!-- This one is OK --> 
     <sublist fields="fields | filter: 'Rumba'" /> <!-- This one raises error --> 
    </div> 

Javascript:

angular.module('myApp', []) 
    .directive('sublist', function() { 
     return { 
      restrict: 'E', 
      scope: { fields: '=' }, 
      template: '<div ng-repeat="f in fields">{{f}}</div>' 
     }; 
    }) 
    .controller('MainCtrl', function($scope) { 
     $scope.fields = ['Samba', 'Rumba', 'Cha cha cha']; 
    }); 

http://jsfiddle.net/GDfxd/14/

Khi tôi cố gắng sử dụng bộ lọc tôi nhận được lỗi này:

Error: 10 $digest() iterations reached. Aborting! 

Có giải pháp cho vấn đề này không?

Trả lời

24

Số lần lặp lại thông báo $ $ thường xảy ra khi có người quan sát thay đổi mô hình. Trong trường hợp lỗi, sự ràng buộc cô lập fields bị ràng buộc với kết quả của một bộ lọc. Sự ràng buộc đó tạo ra một người quan sát. Vì bộ lọc trả về một đối tượng mới từ một lời gọi hàm mỗi khi nó chạy, nó làm cho trình theo dõi liên tục kích hoạt, vì giá trị cũ không bao giờ khớp với giá trị mới (Xem this comment from Igor in Google Groups).

Một sửa chữa tốt sẽ là để ràng buộc fields trong cả hai trường hợp như:

<sublist fields="fields" /></sublist> 

Và thêm một thuộc tính bắt buộc đối với trường hợp thứ hai để lọc:

<sublist fields="fields" filter-by="'Rumba'" /></sublist> 

Sau đó điều chỉnh chỉ thị của bạn như:

return { 
    restrict: 'E', 
    scope: { 
     fields: '=', 
     filterBy: '=' 
    }, 
    template: '<div ng-repeat="f in fields | filter:filterBy">'+ 
       '<small>here i am:</small> {{f}}</div>' 
}; 

Lưu ý: Hãy nhớ đóng các thẻ sublist của bạn bằng fiddle của bạn.

Here is a fiddle

+0

+1 để giải thích và tham khảo. –

+0

Điều gì xảy ra nếu bạn có khả năng cần nhiều bộ lọc, sắp xếp, v.v ...? Có một giải pháp chung để vượt qua bất kỳ danh sách lọc/sắp xếp chung nào để chỉ thị không? –

+0

@EugeneOsovetsky: Tại thời điểm đó, có lẽ dễ dàng hơn/cần thiết để thực hiện việc nâng hạng nặng trong hàm liên kết/điều khiển chỉ thị bằng cách tiêm '$ filter' ở đó. (tức là bối cảnh Q & A này là khung nhìn, chứ không phải là phần điều khiển của mô hình MVC. Bộ điều khiển cho phép phức tạp hơn nhiều.) Xem [stackoverflow.com/a/14302334/2185093](http://stackoverflow.com/a/14302334/2185093) để biết thêm thông tin – sh0ber

1

Corrected Fiddle

Kiểm tra một bài liên quan here.

Trong fiddle, bạn sẽ cần phải có thẻ đóng. Mặc dù bạn vẫn có thể có các thẻ tự chứa như thẻ bạn có.

<sublist fields="fields" filter="'Rumba'"/> <!-- Tested in chrome --> 
+0

bạn cũng có thể có 'lọc' dữ liệu trong phạm vi của bộ điều khiển của bạn. cho rằng bạn sẽ cần phải tiêm ''$ filter' service' trong bộ điều khiển của bạn. bao gồm tham chiếu cho thấy điều này. –

+0

Bạn có thể [sửa] và cập nhật câu trả lời của mình thay vì thêm thông tin vào commnets .... –

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