将参数传递给 angularjs 过滤器

IT技术 javascript angularjs angular-filters
2021-01-24 14:23:10

是否可以将参数传递给过滤器函数,以便您可以按任何名称进行过滤?

就像是

$scope.weDontLike = function(item, name) {
    console.log(arguments);
    return item.name != name;
};
6个回答

实际上还有另一个(可能更好的解决方案),您可以在其中使用 angular 的原生“过滤器”过滤器,并且仍然将参数传递给您的自定义过滤器。

考虑以下代码:

<div ng-repeat="group in groups">
    <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
        <span>{{friend.name}}</span>
    <li>
</div>

要完成这项工作,您只需将过滤器定义如下:

$scope.weDontLike = function(name) {
    return function(friend) {
        return friend.name != name;
    }
}

正如您在此处看到的,weDontLike 实际上返回另一个函数,该函数在其范围内包含您的参数以及来自过滤器的原始项目。

我花了 2 天的时间才意识到你可以做到这一点,还没有在任何地方看到过这个解决方案。

查看angular.js 过滤器的反向极性以了解如何将其用于过滤器的其他有用操作。

如果您的过滤器需要多个参数,请参阅如何使用多个参数调用 Angular.js 过滤器?
2021-03-24 14:23:10
这个答案解决了我无法将 $scope 变量作为参数传递给过滤器函数的问题。最佳解决方案。点赞!
2021-03-24 14:23:10
@DennisSmolek 我有一个疑问,我很长时间以来对这一点感到震惊。如何friend在过滤器功能中访问$scope.weDontLike在我的情况下,当我尝试时,我收到错误消息说“angular.js:12520 ReferenceError:friend is not defined”
2021-04-02 14:23:10
如果我可以不止一次投票,我会确保这是 SO 历史上投票最多的答案。多年来,这一直困扰着我......然后我找到了(现在 2 岁)的答案......非常感谢你。
2021-04-03 14:23:10
这种方法还解决了一个奇怪的问题,即在 ng-repeat 中,我无法将自己的参数传递给过滤器。无论我做什么,它们都会作为索引和整体收藏不断出现。通过执行这个返回方法,我能够传递我的参数并仍然加载原始元素,很好的修复!
2021-04-12 14:23:10

据我了解,您不能将参数传递给过滤器函数(使用“过滤器”过滤器时)。您需要做的是编写一个自定义过滤器,如下所示:

.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;
};

这是工作的 jsFiddle:http : //jsfiddle.net/pkozlowski_opensource/myr4a/1/

另一个简单的替代方法,不编写自定义过滤器是存储一个名称以在范围内过滤掉,然后编写:

$scope.weDontLike = function(item) {
  return item.name != $scope.name;
};
任何动态设置“亚当”(指的是您的 JSFiddle)?在 Angular 中结合 ngModel 和自定义过滤器似乎是不可能的(我猜这是故意的)......
2021-03-19 14:23:10
是否可以重新排序过滤器的参数?例如将项目传递给过滤器的第二个参数?
2021-04-04 14:23:10
值得注意的是,在这个例子中,标记是 {{ items | weDontLike:'thenameyoudontlike' }} ... 现在你必须去小提琴才能得到它。另外值得注意的是,您可以将多个参数传递给您的自定义过滤器 {{ items | weDontLike:'thename':['I am', 'an array']:'and so on' }} 您只需向自定义过滤器添加更多参数即可访问它们。
2021-04-04 14:23:10
太棒了 谢谢!将名称存储在范围中将无法正常工作,因为我在同一页面上有来自相同数据的三个列表,我使用不同的状态(或名称)进行过滤。
2021-04-07 14:23:10

实际上,您可以传递一个参数(http://docs.angularjs.org/api/ng.filter:filter)并且不需要为此自定义函数。如果您按如下方式重写 HTML,它将起作用:

<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>

http://jsfiddle.net/ZfGx4/59/

Not-Not-Adam 显然更糟。
2021-03-20 14:23:10
!亚当是有史以来最糟糕的名字
2021-03-24 14:23:10
jsfiddle 链接已损坏。
2021-03-28 14:23:10
你也可以像这样在这里传递数组 filter:['Adam', 'john']
2021-03-30 14:23:10
是的。旁注 - 如果某人的名字是 '!Adam',你会觉得他像 {name:'!!Adam'}。
2021-04-04 14:23:10

你可以简单地在模板中这样做

<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>

在过滤器

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";
    }
    });
这是最好的答案。它适用于动态对象。这应该是公认的答案。
2021-03-24 14:23:10

扩展pkozlowski.opensource 的答案并使用 javascriptarray's内置过滤器方法,一个美化的解决方案可能是这样的:

.filter('weDontLike', function(){
    return function(items, name){
        return items.filter(function(item) {
            return item.name != name;
        });
    };
});

这是 jsfiddle链接

更多关于数组过滤器在这里