【问题标题】:Filter select options in angularjs在angularjs中过滤选择选项
【发布时间】:2025-11-24 21:20:08
【问题描述】:

在我的 Angularjs 应用程序中,我的代码如下,

HTML:

<div ng-app="test" ng-controller="test">
    <div>
    <input type="checkbox" ng-model="showvalidrates"> Display only Valid Rates
    <br><br>
        <select ng-model="selectRate" 
        ng-options="option.id as option.name for option in data">
        </select>
    </div>
</div>

JS:

angular.module('test', [])
    .controller('test', ['$scope', function ($scope) {
        $scope.data = [
      {name: 'Rate 1', id: 1, valid: true}, 
      {name: 'Rate 2', id: 2, valid: false},
      {name: 'Rate 3', id: 3, valid: true}
      ];
      $scope.selectRate = $scope.data[1].id;
      $scope.showvalidrates = true;
}]);

我在这里使用ng-options 来显示费率,并且我有一个复选框,默认情况下将处于选中状态。

在这种情况下,我需要过滤 ng-options 以仅显示我拥有名为 valid: truevalid: false 的属性的有效汇率。

这里如果复选框被选中,这意味着showvalidrates 为真,那么只有valid: true 的对象需要显示在选项中。但是如果已经选择了该值,在下面给出的工作示例中{name: 'Rate 2', id: 2, valid: false}被选中但它有valid: false 在这种情况下需要显示所选值(意味着Rate 2 只需要处于选中状态)。除非用户触摸选择框,但如果他点击选择框,则只需要显示有效汇率,他可以选择任何有效汇率。

如果他取消选中showvalidrates (false),那么所有费率都需要显示在ng-options ..

JsFiddle: http://jsfiddle.net/opygzs4a/

按照给出的例子,

showvalidrates = true

Options: 

Rate 1

Rate 2 (Selected)

Rate 3

点击选择框只需要显示Rate 1和Rate 3,用户可以选择这两个中的任何一个。

除非选择了这两个中的任何一个,否则 Rate 2 需要处于选中状态,selectRate 的值应仅为 2。

valid属性是代码中新实现的用于过滤数据的属性,所以为了影响应用中早先的selectRate值,需要实现这个场景。(即使valid为false也行除非用户更改,否则选择)..

我对 AngularJs 和这种情况非常陌生,所以请帮助我如何处理这种情况..

如果有任何替代方法也将受到欢迎,但要求与上述相同。

【问题讨论】:

  • 您是否正在尝试显示带有标志-valid true 的选项并寻找类似的东西-codepen.io/nagasai/pen/jjywBK?editors=1010?对于这个选项,使用 filter - ng-options="option.id as option.name for option in data|filter:{valid:true}
  • @NagaSaiA,我已将您的解决方案中的预期结果解释为评论..

标签: javascript jquery html angularjs ng-options


【解决方案1】:

为了达到预期的效果,请使用下面的使用带有复选框条件的过滤器的选项

ng-options="option.id as option.name for option in data|filter: !init && showvalidrates?{valid:true}:{}" ng-init="init = true">

  1. 在检查时,showvalidrates 为 true,并基于设置为 { valid: true } 的过滤器来显示带有标记 valid -true 的选项
  2. 取消选中时,showvalidrates 为 false,并且基于设置为 {} 的过滤器
  3. 添加 ng-init 标志来控制初始默认值

Codepen - https://codepen.io/nagasai/pen/GbrOMm?editors=1010

工作代码示例

angular.module('test', [])
    .controller('test', ['$scope', function ($scope) {
        $scope.data = [
      {name: 'Rate 1', id: 1, valid: true}, 
      {name: 'Rate 2', id: 2, valid: false},
      {name: 'Rate 3', id: 3, valid: true}
      ];
      $scope.selectRate = $scope.data[1].id;
      $scope.showvalidrates = true;
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="test" ng-controller="test">
    <div>
    <input type="checkbox" ng-model="showvalidrates" ng-change="init = false"> Display only Valid Rates
    <br><br>
        <select ng-model="selectRate" 
        ng-options="option.id as option.name for option in data|filter: !init && showvalidrates?{valid:true}:{}" ng-init="init = true" ng-click="init = false">
        </select>
    </div>
</div>

【讨论】:

  • OP 还希望显示“无效”选项是否已被选中,但由于您将其从选项列表中过滤出来,因此不会显示。
  • 感谢您的帮助.. 但是尽管选择了复选框,但我仍需要显示所选值默认值.. 含义 $scope.selectRate = $scope.data[1].id; 表示 Rate 2 已选中,因此需要显示此值默认.. 再次单击选择框时,只需要显示两个(有效)汇率,但在此之前只需要选择Rate 2 并且selectRate 应该将值保持为2 直到更改.. 就像我的工作示例..希望您理解要求..
  • @ManirajfromKarur,用 ng-init 更新了我的答案以控制初始值,希望它有效:)
  • @NagaSaiA,但是在单击选择框时,用户只需要看到两个费率,但您更新的演示显示了三个费率。我不确定处理这件事,我认为整个事情都需要自定义以达到结果..因为在单击Rate 1Rate 3 后,不允许用户再次选择Rate 2(用户可以在您的解决方案中选择Rate 2).. 如果您花点时间并给予帮助,将会很有帮助更好的解决方案..有关更多信息,即使您将所有三个复选框都显示为 true,但如果用户选择其他费率,则需要阻止用户选择 Rate 2..
  • 使用 ng-click="init = false" 选择更新的答案将修复该部分 -codepen.io/nagasai/pen/GbrOMm