Cách lọc theo thuộc tính đối tượng trong angularJS


139

Tôi đang cố gắng tạo một bộ lọc tùy chỉnh trong AngularJS sẽ lọc danh sách các đối tượng theo các giá trị của một thuộc tính cụ thể. Trong trường hợp này, tôi muốn lọc theo thuộc tính "phân cực" (các giá trị có thể có của "Tích cực", "Trung tính", "Tiêu cực").

Đây là mã làm việc của tôi mà không có bộ lọc:

HTML:

<div class="total">
    <h2 id="totalTitle"></h2>
    <div>{{tweets.length}}</div>
    <div id="totalPos">{{tweets.length|posFilter}}</div>
    <div id="totalNeut">{{tweets.length|neutFilter}}</div>
    <div id="totalNeg">{{tweets.length|negFilter}}</div>
</div>

Đây là mảng "$ scope.tweets" ở định dạng JSON:

{{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user       screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"}}

Bộ lọc tốt nhất tôi có thể đưa ra như sau:

myAppModule.filter('posFilter', function(){
return function(tweets){
    var polarity;
    var posFilterArray = [];
    angular.forEach(tweets, function(tweet){
        polarity = tweet.polarity;
        console.log(polarity);
        if(polarity==='Positive'){
              posFilterArray.push(tweet);
        }
        //console.log(polarity);
    });
    return posFilterArray;
};
});

Phương thức này trả về một mảng trống. Và không có gì được in từ câu lệnh "console.log (Polarity)". Có vẻ như tôi không chèn các tham số chính xác để truy cập thuộc tính đối tượng của "cực tính".

Có ý kiến ​​gì không? Phản hồi của bạn được đánh giá rất cao.


3
Câu hỏi hay, nhưng mã có thể được giảm, phần lớn của nó không liên quan đến câu hỏi.
setec

Câu trả lời:


218

Bạn chỉ cần sử dụng filterbộ lọc (xem tài liệu ):

<div id="totalPos">{{(tweets | filter:{polarity:'Positive'}).length}}</div>
<div id="totalNeut">{{(tweets | filter:{polarity:'Neutral'}).length}}</div>
<div id="totalNeg">{{(tweets | filter:{polarity:'Negative'}).length}}</div>

Fiddle


1
Có cách nào để lọc danh sách mục bằng cách chuyển bộ lọc tùy chỉnh đến sự kiện ng-click bên ngoài câu lệnh ng-repeat không? Trong trường hợp này, tôi muốn đặt ba nút "phân cực" phía trên các kết quả mà bộ lọc dựa trên xếp hạng.
sh3nan1gans

2
Tôi không chắc chắn để hiểu. Nếu bạn muốn chọn cực tính để lọc, bạn có thể chuyển một biến phạm vi thay vì văn bản đơn giản: filter:{polarity:polarityToFilter}nơi $scope.polarityToFilterđược lấp đầy bằng một nhấp chuột vào một trong ba nút. Đây có phải là những gì bạn đang cố gắng để làm?
Hố đen

Có vẻ như nó có thể làm việc. Tuy nhiên, ứng dụng của tôi cũng cần có khả năng xóa từng mục danh sách.
sh3nan1gans

Vấn đề với việc lọc là một mảng mới được tạo ra mỗi khi bộ lọc được áp dụng, phá vỡ sự ràng buộc giữa một mục được lọc và chỉ mục ban đầu của nó trong mảng chưa được lọc. Có cách nào để duy trì cà vạt hay là ng-ẩn lựa chọn duy nhất của tôi? Đây là một hướng dẫn thay thế cho việc lọc bằng cách sử dụng ng-hide: bennadel.com/blog/,
sh3nan1gans

ngRepeat trưng ra một bản sửa lỗi $indextrên phạm vi cục bộ mà bạn cũng có thể sử dụng.
Hố đen

27

Các tài liệu có câu trả lời đầy đủ. Dù sao đây là cách nó được thực hiện:

<input type="text" ng-model="filterValue">
<li ng-repeat="i in data | filter:{age:filterValue}:true"> {{i | json }}</li>

sẽ chỉ lọc agetrong datamảng và truephù hợp chính xác.

Để lọc sâu,

<li ng-repeat="i in data | filter:{$:filterValue}:true"> {{i}}</li>

Đây $là một thuộc tính đặc biệt cho bộ lọc sâu và truephù hợp chính xác như trên.


Đơn giản và sạch sẽ.
đáng sợ

Bộ lọc này đã sẵn sàng hay cần được viết bằng cả Angular & AngularJS?
P Satish Patro

23

Bạn cũng có thể làm điều này để làm cho nó năng động hơn.

<input name="filterByPolarity" data-ng-model="text.polarity"/>

Sau đó, bạn sẽ lặp lại như thế này

<div class="tweet" data-ng-repeat="tweet in tweets | filter:text"></div>

Bộ lọc này tất nhiên sẽ chỉ được sử dụng để lọc theo cực tính


5

Chúng tôi có Bộ sưu tập như sau:


nhập mô tả hình ảnh ở đây

Cú pháp:

{{(Collection/array/list | filter:{Value : (object value)})[0].KeyName}}

Thí dụ:

{{(Collectionstatus | filter:{Value:dt.Status})[0].KeyName}}

-HOẶC LÀ-

Cú pháp:

ng-bind="(input | filter)"

Thí dụ:

ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName"

4

Bạn có thể thử điều này. nó hoạt động với tôi 'tên' là một tài sản trong mảng.

repeat="item in (tagWordOptions | filter:{ name: $select.search } ) track by $index
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.