【问题标题】:Multiple optional filters in angular角度中的多个可选过滤器
【发布时间】:2016-01-08 14:25:53
【问题描述】:

我是 angular 的新手,我不确定如何控制过滤器的行为。

在应用程序中,我有两个不同的single-select 下拉控件,用于过滤我的数据集的结果并填充表格。然而,即使这些过滤器工作,结果取决于两个控件,如果两者都没有被使用,则返回空集。所以,我的问题是:我怎样才能有选择地使用这些过滤器?那么,当过滤器未使用时,应用程序会返回每个结果,还是返回由其中一个控件或两者都过滤的结果?

谢谢

代码如下:

AngularJS

每个控件的过滤器。它们看起来非常相似:

.filter('byField', function () {
    return function (results, options) {
        var items = { options: options, out: [] };
        angular.forEach(results, function (value, key) {

            for (var i in this.options) {
                if ((options[i].value === value.fieldId && 
                     options[i].name === "Field" && 
                     options[i].ticked === true)) {
                        this.out.push(value);
                     }
            }
        }, items);
        return items.out;
    };
})

.filter('byClass', function () {
    return function (results, options) {
        var items = { options: options, out: [] };
        angular.forEach(results, function (value, key) {

            for (var i in this.options) {
                if ((options[i].value === value.documentClass &&
                     options[i].name === "Class" && 
                     options[i].ticked === true)) {
                        this.out.push(value);
                     }
            }

        }, items);
        return items.out;
    };
})

HTML

这是我正在做的填充表的rows

<tr ng-repeat="result in results | byField:outputFields | byClass:outputClasses">
    <td>{{result.documentId}}</td>
    ...
</tr>

【问题讨论】:

    标签: angularjs angular-filters


    【解决方案1】:

    Dorado7.1 在所有事件监听器中都提供了一个视图隐含变量指向当前事件宿主的视图,该变量可以完全替代这种场景的使用。

    【讨论】:

      【解决方案2】:

      嗯,正如我想象的那样,答案与 set theory 的相关性比与 angular 的相关性更高。

      我刚刚在空集和每个结果之间创建了一个union,它起作用了。

      .filter('byField', function () {
          return function (results, options) {
              var items = { options: options, out: [] };
              angular.forEach(results, function (value, key) {
                  if (options.length) {
                      for (var i in this.options) {
                          if ((options[i].value === value.fieldId &&
                               options[i].name === "Field" && 
                               options[i].ticked === true)) {
                                  this.out.push(value);
                               }
                      }
                  } else {
                      this.out = results.slice();                        
                  }                   
              }, items);
              return items.out;
          };
      })
      

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多