Angularjs過濾器是 angularjs非常棒的特性之一。有朝一日,你可能需要使用自定義過濾器,幸運的是,你找到了這篇博文。
下面顯示的是自定義過濾器長什麼樣子(請注意myfilter):
<tr ng-repeat="friend in friends |myfilter:'param1':'param2':true:'windowScopedFilter'">
我們的自定義過濾器叫做 "myfilter", 它有由 ':'隔開的4個參數.
這是一個將會用到的樣本輸入:
$scope.friends = [{name:
'John'
, phone:
'555-1276'
},
{name:
'Annie'
, phone:
'800-BIG-MARY'
},
{name:
'Mike'
, phone:
'555-4321'
},
{name:
'Adam'
, phone:
'555-5678'
},
{name:
'David'
, phone:
'555-8765'
},
{name:
'Mikay'
, phone:
'555-5678'
}];
過濾"555"的處理流程由 "windowScopedFilter"執行, 它是過濾器 'myfilter'的第四個參數.
下面我們來實現這些功能 (把logging添加到每個輸入參數):
var
myapp = angular.module(
'MyFilterApp'
, []);
myapp.filter(
'myfilter'
,
function
() {
return
function
(input, param1) {
console.log(
"------------------------------------------------- begin dump of custom parameters"
);
console.log(
"input="
,input);
console.log(
"param1(string)="
, param1);
var
args = Array.prototype.slice.call(arguments);
console.log(
"arguments="
, args.length);
if
(3<=args.length) {
console.log(
"param2(string)="
, args[2]);
}
if
(4<=args.length) {
console.log(
"param3(bool)="
, args[3]);
}
console.log(
"------------------------------------------------- end dump of custom parameters"
);
// filter
if
(5<=args.length) {
return
window[args[4]](input);
}
return
input;
};
});
上面的代碼大多都log了(譯者注:將信息顯示到控制台). 實際完成過濾的最重要的一部分是:
// filter
if
(5<=args.length) {
return
window[args[4]](input);
}
return
input;
"return window[args[4]](input)" 調用第四個參數, 它是 'windowScopedFilter'.
這是控制台輸出:
"------------------------------------------------- begin dump of custom parameters"
custom_filter_function.html:21
"input="
[object Array] custom_filter_function.html:22
"param1(string)="
"param1"
custom_filter_function.html:23
"arguments="
5 custom_filter_function.html:25
"param2(string)="
"param2"
custom_filter_function.html:27
"param3(bool)="
true
custom_filter_function.html:30
"------------------------------------------------- end dump of custom parameters"
custom_filter_function.html:32
"------------------------------------------------- begin dump of custom parameters"
custom_filter_function.html:21
"input="
[object Array] custom_filter_function.html:22
"param1(string)="
"param1"
custom_filter_function.html:23
"arguments="
5 custom_filter_function.html:25
"param2(string)="
"param2"
custom_filter_function.html:27
"param3(bool)="
true
custom_filter_function.html:30
"------------------------------------------------- end dump of custom parameters"
custom_filter_function.html:32
完整代碼:
<html>
<head>
<script src=
"angular.min.js"
></script>
<script type=
"text/javascript"
>
function
windowScopedFilter (input) {
var
output = [];
angular.forEach(input,
function
(v,k){
if
(v.phone.contains(
"555"
)) {
output.push(v);
}
});
return
output;
}
var
myapp = angular.module(
'MyFilterApp'
, []);
myapp.filter(
'myfilter'
,
function
() {
return
function
(input, param1) {
console.log(
"------------------------------------------------- begin dump of custom parameters"
);
console.log(
"input="
,input);
console.log(
"param1(string)="
, param1);
var
args = Array.prototype.slice.call(arguments);
console.log(
"arguments="
, args.length);
if
(3<=args.length) {
console.log(
"param2(string)="
, args[2]);
}
if
(4<=args.length) {
console.log(
"param3(bool)="
, args[3]);
}
console.log(
"------------------------------------------------- end dump of custom parameters"
);
// filter
if
(5<=args.length) {
return
window[args[4]](input);
}
return
input;
};
});
myapp.controller(
'MyFilterController'
, [
'$scope'
,
function
($scope) {
$scope.friends = [{name:
'John'
, phone:
'555-1276'
},
{name:
'Annie'
, phone:
'800-BIG-MARY'
},
{name:
'Mike'
, phone:
'555-4321'
},
{name:
'Adam'
, phone:
'555-5678'
},
{name:
'David'
, phone:
'555-8765'
},
{name:
'Mikay'
, phone:
'555-5678'
}];
}]);
</script>
</head>
<body ng-app=
"MyFilterApp"
>
<div ng-controller=
"MyFilterController"
>
<table id=
"searchTextResults"
>
<tr><th>Name</th><th>Phone</th></tr>
<tr ng-repeat=
"friend in friends |myfilter:'param1':'param2':true:'windowScopedFilter'"
>
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
</tr>
</table>
</div>
<hr>
</body>
</html>
帶你走近AngularJS系列:
如何在 AngularJS 中對控制器進行單元測試 http://www.linuxidc.com/Linux/2013-12/94166.htm
在 AngularJS 應用中通過 JSON 文件來設置狀態 http://www.linuxidc.com/Linux/2014-07/104083.htm
AngularJS 之 Factory vs Service vs Provider http://www.linuxidc.com/Linux/2014-05/101475.htm
AngularJS —— 使用 ngResource、RESTful APIs 和 Spring MVC 框架提交數據 http://www.linuxidc.com/Linux/2014-07/104402.htm
AngularJS 的詳細介紹:請點這裡
AngularJS 的下載地址:請點這裡