如何在AngularJS中使用方法作为过滤器

How to use method as filter in AngularJS?

本文关键字:过滤器 使用方法 AngularJS      更新时间:2023-09-26

我有一个自定义数据类型Message:

function Message(body, author, date) {
    this.body = body;
    this.author = author;
    this.date = date;
    this.stars = [];
}
Message.prototype.hasStars = function() {
    return this.stars.length !== 0;
};

我也在重复这些消息的数组:

<li ng-repeat='message in messages | orderBy:"-stars.length"'>…</li>

如何向它添加一个调用message.hasStars()的筛选器?我尝试了以下方法,但都没有效果:

message in messages | filter:message.hasStars() | orderBy:"-stars.length"
message in messages | filter:message:hasStars() | orderBy:"-stars.length"
message in messages | filter:message.hasStars | orderBy:"-stars.length"
message in messages | filter:message:hasStars | orderBy:"-stars.length"

http://jsfiddle.net/DGKNN/

filter期望有一个计算结果为作用域上谓词的表达式。这是一个函数,它将元素作为参数,并返回该元素是否应包含在集合中。

在您的控制器中:

$scope.hasStars = function (message) {
    return message.hasStars();
};

在您看来:

<li ng-repeat='message in messages | filter:hasStars | orderBy:"-stars.length"'>...</li>

我假设有一个名为mySrv的服务将消息加载到您的控制器中。

myapp.controller('myCtrlr',['$scope','mySrv',function($scope,mySrv){
    $scope.messages = mySrv.getMessages();
}]); // end myCtrlr
myapp.filter('hasStars',function(){
    return function(msg){
        return msg.stars.length > 0;
    };
});

在模板中

<ul ng-controller="myCtrlr">
    <li ng-repeat="message in messages | hasStars | orderBy:"-stars.length">...</li>
</ul>