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

时间:2013-08-29 18:22:39

标签: javascript angularjs

我有自定义数据类型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"

2 个答案:

答案 0 :(得分:4)

http://jsfiddle.net/DGKNN/

filter期望有一个表达式可以计算范围的谓词。这是一个函数,它接受一个元素作为参数,并返回该元素是否应该包含在集合中。

在您的控制器中:

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

在您看来:

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

答案 1 :(得分:1)

我假设一些名为 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>