2012-11-07 48 views
21

Tôi có một tập hợp các mục mà tôi muốn lọc trong ng-lặp lại bằng cách sử dụng ng-model làm chuỗi để lọc tập hợp, cho đến nay tôi chưa tìm được cách để làm cho nó hoạt động khi biểu thức bị từ chối, tôi đang làm một cái gì đó như thế này:Bộ lọc Angularjs phủ nhận

Trong documentation, nó nói rằng chúng ta nên sử dụng! để phủ nhận biểu thức nhưng vẫn không có may mắn.

Tôi đang làm gì sai?

+1

Nếu bộ lọc của bạn là giải pháp phương pháp (không phải chuỗi hoặc mô hình) được đăng tại đây: http://stackoverflow.com/questions/13464809/reverse-polarity-of-an-angular-js-filter/17811582#17811582 –

Trả lời

42

'!' nhân vật thêm vào trước vào chuỗi lọc, như dưới đây:

lọc: '!' + languageOrigin

<select ng-model="languageOrigin" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages">{{language}}</option> 
</select> 
<select ng-model="languageDestination" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages | filter:'!'+languageOrigin">{{language}}</option> 
</select> 
+1

Đó là vấn đề. các '!' cần phải là một nhân vật. Cảm ơn! – lgomezma

+0

Sử dụng 'ng-options' khi chọn thay vì' ng-repeat'. – EpokK

+0

Điều này vẫn được hỗ trợ trong v1.2.0rc1? Tôi không thể làm việc này được. –

4

CẬP NHẬT: xem câu trả lời của ENDOH takanao.

Nhìn vào AngularJS source code, có vẻ như '!' phủ nhận kết quả của các vị, không phải là vị bản thân:

var search = function(obj, text){ 
    if (text.charAt(0) === '!') { 
     return !search(obj, text.substr(1)); 
    } 
    switch (typeof obj) { 
    ... 

Vì vậy, có một cách để làm việc xung quanh này là để [Nếu bạn không thích + myFilter cú pháp, '!'] bạn có thể xác định chức năng ngữ của riêng bạn trong điều khiển của bạn:

$scope.inverseOriginFilter = function(item) { 
    return item.search($scope.languageOrigin) == -1 
} 

Sau đó, sử dụng nó trong HTML của bạn:

<select ng-model="languageDestination" ng-change="updatePrice()" 
    ng-options="language for language in languages | filter:inverseOriginFilter"> 
</select> 

Ví dụ fiddle.

+0

thực sự hoạt động, nhưng tôi đã tự hỏi nếu nó không được thực hiện trực tiếp bởi AngularJS ... – lgomezma

+0

điều này hoạt động tốt nếu mô hình của bạn cho mỗi lựa chọn thả xuống là đích chính nó, nhưng những gì nếu nó gắn liền với cái gì khác đã? – iamwhitebox

22

Nếu sử dụng các đối tượng, bạn cũng có thể quan tâm như sau:

<li data-ng-repeat="obj in objs | filter:({obj_attr: '!obj_val'})"> 
    ... 
</li> 

Thử nghiệm trong AngularJS 1.1.5.

+2

nó hoạt động khi obj_attr chứa giá trị chuỗi nhưng làm thế nào tôi nên chỉ định không null? Hoặc không '' (trống) chuỗi? –

+0

ví dụ đã làm nó cho tôi, nhưng hãy cẩn thận rằng nếu bạn muốn lọc dựa trên các chuỗi không có sản phẩm nào, nó sẽ trông khủng khiếp nhưng vẫn hoạt động: 'filter: {prop: '!'}' where '!' chuyển thành 'không trống'. Xấu xí, nhưng nó hoạt động :) –

2

Nếu bạn đang sử dụng một phương pháp để lọc hơn tiền tố tên phương thức với '!' sẽ không làm việc. Thay vào đó bạn có thể làm điều gì đó như:

// You can register this in your AppCtrl if you like, otherwise just use $scope. 
$rootScope.not = function(func) { 
    return function (item) { 
     return !func(item); 
    } 
}; 

Sau đó, bạn làm:

filter:not(myFilterMethod) 

Trong html của bạn nó sẽ trông giống như:

<select ng-model="languageDestination" ng-change="updatePrice()"> 
    <option ng-repeat="language in languages | filter:not(languageOrigin)">{{language}}</option> 
</select> 

tham khảo: https://stackoverflow.com/a/17811582/175830

1

tôi m sử dụng giải pháp 1.3.15 và ENDOH's không hoạt động. Thay vào đó, filter:'!':languageOrigin đã làm việc cho tôi.

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