【问题标题】:Passing arguments to angularjs filters将参数传递给 angularjs 过滤器
【发布时间】:2012-07-29 23:59:05
【问题描述】:

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

有点像

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

【问题讨论】:

    标签: javascript angularjs angular-filters


    【解决方案1】:

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

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

    【讨论】:

    • 那太好了,谢谢!将名称存储在范围中效果不佳,因为我在同一页面上使用不同的状态(或名称)过滤来自相同数据的三个列表。
    • 任何动态设置'Adam'(指您的JSFiddle)?在 Angular 中结合 ngModel 和自定义过滤器似乎是不可能的(我猜这是故意的)......
    • 是否可以重新排序过滤器的参数?例如将项目传递给过滤器的第二个参数?
    • 值得注意的是,在这个例子中,标记是 {{ items | weDontLike:'thenameyoudontlike' }} ...现在你必须去小提琴才能得到它。另外值得注意的是,您可以将多个参数传递给您的自定义过滤器 {{ items | weDontLike:'thename':['I am', 'an array']:'等等' }} 您只需向自定义过滤器添加更多参数即可访问它们。
    【解决方案2】:

    实际上,您可以传递一个参数(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/

    【讨论】:

    • 是的。旁注 - 如果某人的名字是 '!Adam',你会得到他像 {name:'!!Adam'}。
    • 你也可以在这里传递数组,像这样filter:['Adam', 'john']
    • jsfiddle 链接已损坏。
    • !亚当是有史以来最糟糕的名字
    • Not-Not-Adam 显然更糟。
    【解决方案3】:

    实际上还有另一个(可能是更好的解决方案),您可以在其中使用 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 天的时间才意识到你可以做到这一点,还没有在任何地方看到这个解决方案。

    查看Reverse polarity of an angular.js filter,了解如何将其用于过滤器的其他有用操作。

    【讨论】:

    • 如果您的过滤器需要多个参数,请参阅How do I call an Angular.js filter with multiple arguments?
    • 此方法还解决了一个奇怪的问题,即在 ng-repeat 中我无法将自己的参数传递给我的过滤器。无论我做什么,它们都会作为索引和整体收藏回来。通过执行此返回方法,我能够传递我的参数并仍然加载原始元素,很好的修复!
    • 这个答案解决了我无法将 $scope 变量作为参数传递给过滤器函数的问题。最佳解决方案。点赞!
    • 如果我可以多次投票,我会确保这是 SO 历史上投票最多的答案。多年来,这一直困扰着我……然后我找到了(现在 2 岁的)答案……非常感谢。
    • @DennisSmolek 我有一个疑问,我很早就对这一点感到震惊。如何在过滤函数$scope.weDontLike 中访问friend。就我而言,当我尝试时,我收到一条错误消息,提示“angular.js:12520 ReferenceError:friend is not defined”
    【解决方案4】:

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

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

    这是 jsfiddle link

    更多关于数组过滤器here

    【讨论】:

      【解决方案5】:

      你可以这样做 在模板中

      <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";
          }
          });
      

      【讨论】:

      • 这是最好的答案。它适用于动态对象。这应该是公认的答案。
      【解决方案6】:

      您可以将多个参数传递给角度过滤器!

      定义我的 Angular 应用和应用级别变量 -

      var app = angular.module('filterApp',[]);
      app.value('test_obj', {'TEST' : 'test be check se'});
      

      您的过滤器将类似于:-

      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;
        }]);
      

      从 HTML 中,您将发送如下数据:-

      <span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
      

      这里我向过滤器发送一个 JSON 对象。 您还可以发送任何类型的数据,例如字符串或数字。

      您也可以将动态数量的参数传递给过滤器, 在这种情况下,您必须使用 arguments 来获取这些参数。

      如需工作演示,请访问此处 - passing multiple arguments to angular filter

      【讨论】:

        【解决方案7】:

        您可以简单地使用| filter:yourFunction:arg

        <div ng-repeat="group in groups | filter:weDontLike:group">...</div>
        

        在js中

        $scope.weDontLike = function(group) {
        //here your condition/criteria
        return !!group 
        }
        

        【讨论】:

          猜你喜欢
          • 2016-04-17
          • 2021-12-02
          • 1970-01-01
          • 2013-08-17
          • 2018-04-14
          • 2015-09-13
          • 1970-01-01
          相关资源
          最近更新 更多