【问题标题】:Angular custom filter with multiple dropdown conditions具有多个下拉条件的角度自定义过滤器
【发布时间】:2015-11-29 01:35:35
【问题描述】:

我正在尝试使用多个下拉条件进行过滤。我能够弄清楚如何一一过滤它们。我希望它们在未选择任何内容时全部显示,value = ""。

<select class="form-control" ng-model="filter.grade">
  <option ng-repeat="grade in product_grades" value="{{grade}}">{{grade}}</option>
</select>

<select class="form-control" ng-model="filter.slump">
  <option ng-repeat="slump in product_slumps" value="{{slump}}">{{slump}}</option>
</select>

<select class="form-control" ng-model="filter.flow">
  <option ng-repeat="flow in product_flows" value="{{flow}}">{{flow}}</option>
</select>

<select class="form-control" ng-model="filter.last_delivered">
  <option ng-repeat="last_delivered in product_last_delivereds" value="{{last_delivered}}">{{displayDate(last_delivered)}}</option>
</select>

<tr ng-repeat="job_product in job_products | filter : customFilter">

对于一个下拉菜单,我使用它。

$scope.customFilter = function (data) {
    if (data.Grade === $scope.filter.grade) {
      return true;
    } else if ($scope.filter.grade === '') {
      return true;
    } else {
      return false;
    }
  };

但是当我将它用于多个下拉菜单时,它可以工作。

$scope.customFilter = function (data) {
    if (data.Grade === $scope.filter.grade && 
      data.Slump === $scope.filter.slump && 
      data.Flow === $scope.filter.flow && 
      data.LastDlvDate === $scope.filter.last_delivered) {
      return true;
    } else if ($scope.filter.grade === '') {
      return true;
    } else {
      return false;
    }
  };

当我现在选择一个放置选项时,它什么都不显示。

这是一个笨蛋:

http://plnkr.co/edit/elwmuqLvhYhIw3rUrEO1?p=preview

我不确定为什么日期的 $filter 不起作用。

但我想在选择 Grade = "1" 时显示具体的 A。

【问题讨论】:

  • 尝试从用ng-options 替换ng-repeat 开始,看看这是否使任务更容易。
  • 我不太确定如何让它工作
  • 你能提供一个完整的例子和一些示例数据吗?
  • 克莱斯我加了一个小插曲
  • 对不起,我想我一开始问的问​​题不正确,我现在编辑了这个问题,希望通过 plunker 示例更有意义

标签: javascript angularjs


【解决方案1】:

这是一个工作示例 - http://plnkr.co/edit/VTnbqchrdsrN5w0mflji?p=preview

出了什么问题?

  • $scope.customFilter 条件错误 - data.grade === $scope.filter.grade。每个$scope.filter.* 的默认值为空字符串'',因为您将&amp;&amp; 一起使用,而data.grade 被选中,其他为'' === undefined,最终为false。所以我将条件更改为!$scope.filter.grade || data.grade === $scope.filter.grade &amp;&amp; ...。这是因为我检查了选择是否根本没有改变,我通过返回true 来忽略它,然后如果选择的等于data。这也使} else if ($scope.filter.grade === '') { 变得无关紧要。

关于实现的附加说明:

  • 您不必初始化作用域变量$scope.filter.grade = "";,Angular 会在第一次选择时更改。
  • 修复了日期过滤器部分,不再需要$scope.displayDate。您可以在模板{{last_delivered | date: 'dd-MM-yyyy'}} 中应用过滤器

【讨论】:

  • 对于最后一次交付,它可以在您的 plunker 中运行,但由于某种原因在我的代码中,它会将 {{last_delivered}} 的值转换为不同的时区并且它不起作用 - “2015- 11-18T16:00:00.000Z" ,任何想法
  • 可能是因为您的$scope.last_delivered 应该是所有可能日期的$scope.product_last_delivereds 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2019-02-16
  • 2013-03-07
  • 2015-06-26
  • 2020-12-22
相关资源
最近更新 更多