Có thể truyền một đối số cho hàm bộ lọc để bạn có thể lọc theo bất kỳ tên nào không?
Cái gì đó như
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Có thể truyền một đối số cho hàm bộ lọc để bạn có thể lọc theo bất kỳ tên nào không?
Cái gì đó như
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Câu trả lời:
Trên thực tế, có một giải pháp khác (có thể tốt hơn) nơi bạn có thể sử dụng bộ lọc 'bộ lọc' gốc của góc và vẫn chuyển các đối số vào bộ lọc tùy chỉnh của mình.
Hãy xem xét đoạn mã sau:
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Để làm cho việc này hoạt động, bạn chỉ cần xác định bộ lọc của mình như sau:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
Như bạn có thể thấy ở đây, weDontLike thực sự trả về một hàm khác có tham số của bạn trong phạm vi của nó cũng như mục gốc đến từ bộ lọc.
Tôi mất 2 ngày để nhận ra bạn có thể làm được điều này, vẫn chưa thấy giải pháp này ở đâu.
Kiểm tra Phân cực ngược của bộ lọc angle.js để xem cách bạn có thể sử dụng bộ lọc này cho các hoạt động hữu ích khác với bộ lọc.
Theo những gì tôi hiểu, bạn không thể chuyển đối số vào một hàm bộ lọc (khi sử dụng bộ lọc 'bộ lọc'). Những gì bạn sẽ phải làm là viết một bộ lọc tùy chỉnh, như sau:
.filter('weDontLike', function(){
return function(items, name){
var arrayToReturn = [];
for (var i=0; i<items.length; i++){
if (items[i].name != name) {
arrayToReturn.push(items[i]);
}
}
return arrayToReturn;
};
Đây là jsFiddle đang hoạt động: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
Một giải pháp thay thế đơn giản khác, không cần viết bộ lọc tùy chỉnh là lưu tên để lọc ra trong một phạm vi và sau đó viết:
$scope.weDontLike = function(item) {
return item.name != $scope.name;
};
Trên thực tế, bạn có thể chuyển một tham số ( http://docs.angularjs.org/api/ng.filter:filter ) và không cần một hàm tùy chỉnh chỉ cho việc này. Nếu bạn viết lại HTML của mình như bên dưới, nó sẽ hoạt động:
<div ng:app>
<div ng-controller="HelloCntl">
<ul>
<li ng-repeat="friend in friends | filter:{name:'!Adam'}">
<span>{{friend.name}}</span>
<span>{{friend.phone}}</span>
</li>
</ul>
</div>
</div>
filter:['Adam', 'john']
Bạn chỉ có thể làm như thế này trong Mẫu
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
Trong bộ lọc
angular.module("app")
.filter("firstFiler",function(){
console.log("filter loads");
return function(items, firstArgument,secondArgument){
console.log("item is ",items); // it is value upon which you have to filter
console.log("firstArgument is ",firstArgument);
console.log("secondArgument ",secondArgument);
return "hello";
}
});
Mở rộng trên câu trả lời của pkozlowski.opensource và sử dụng array's
phương pháp lọc nội trang javascript, một giải pháp đã được kiểm duyệt có thể là:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Đây là liên kết jsfiddle .
Thông tin thêm về bộ lọc Mảng tại đây .
Bạn có thể chuyển nhiều đối số vào bộ lọc góc!
Xác định ứng dụng góc cạnh của tôi và một biến cấp ứng dụng -
var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});
Bộ lọc của bạn sẽ như sau: -
app.filter('testFilter', [ 'test_obj', function(test_obj) {
function test_filter_function(key, dynamic_data) {
if(dynamic_data){
var temp = test_obj[key];
for(var property in dynamic_data){
temp = temp.replace(property, dynamic_data[property]);
}
return temp;
}
else{
return test_obj[key] || key;
}
}
test_filter_function.$stateful = true;
return test_filter_function;
}]);
Và từ HTML, bạn sẽ gửi dữ liệu như: -
<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
Ở đây tôi đang gửi một đối tượng JSON đến bộ lọc. Bạn cũng có thể gửi bất kỳ loại dữ liệu nào như chuỗi hoặc số.
bạn cũng có thể truyền số lượng đối số động để lọc, trong trường hợp đó bạn phải sử dụng đối số để lấy các đối số đó.
Để có bản demo hoạt động, hãy truy cập vào đây - chuyển nhiều đối số vào bộ lọc góc
Bạn chỉ cần sử dụng | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
Và trong js
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}