具有ng-repeat的AngularJS依赖下拉列表

时间:2016-04-08 23:06:21

标签: javascript angularjs ng-repeat angularjs-filter ng-options

我有两个下拉字段,第二个字段取决于第一个中的选择。

第一个下拉列表的数据来自一个数据集。它列出了与帐户ng-repeat="option in acctList"相关联的数字。

我想转到其他数据集,找到匹配的帐号,然后显示与该帐户相关的客户。如果在第一个中没有选择任何内容,则第二个下拉列表不显示任何内容(空白)。

这是我的两个下拉菜单:http://plnkr.co/edit/jDitkge1rx6GJzkdElJO?p=preview

这是我的控制器:

angular.module("app", [])
  .controller("MainCtrl", function($scope) {
    $scope.test = "This is a test";
    $scope.defnum = 1;
    $scope.acct_info = [
      {
        "Req": "MUST",
        "DefCom": "1"
      },
      {
        "Req": "NoMUST",
        "DefCom": "5"
      },
      {
        "Req": "MUST",
        "DefCom": "4"
      },
      {
        "Req": "MUST",
        "DefCom": "7"
      }
    ];

    $scope.cust_info = [
      {
        "Customer": "1",
        "Com": "1"
      },
      {
        "Customer": "2",
        "Com": "1"
      },
      {
        "Customer": "3",
        "Com": "4"
      },
      {
        "Customer": "4",
        "DefCom": "4"
      },
      {
        "Customer": "5",
        "DefCom": "7"
      },
      {
        "Customer": "6",
        "DefCom": "7"
      },
      {
        "Customer": "7",
        "DefCom": "7"
      }
    ];
  });

我添加ng-repeat="option in cust_info | filter:{ Com : filter.DefCom }"尝试根据此SO答案过滤第二个:Filter ng-options from ng-options selection 但它不起作用。我还看了一下本教程:http://kenhowardpdx.com/blog/2015/05/angular-ngrepeat-and-ngoptions-comparison/

然而,他使用了我所见过的$ watch,并且他必须为每个场景写出一个if循环,这不太理想。

我尝试过使用ng-change,但我认为应该有更简单的方法,例如filtertrack by。我还想知道是否应该从ng-repeat更改为ng-option。任何人都有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

最好将选项的选项与ng-options绑定。请参阅下面的代码,我希望它有所帮助。

<body ng-app="app">
<h1>Hello Plunker!</h1>
<div ng-controller="MainCtrl">
  <p>{{ test }}</p>
  <select ng-model="defcom" ng-options="opt.DefCom for opt in acct_info | filter:{Req:'MUST'}:true" >>
  </select>
  <select ng-model="com" ng-options="opt.Customer for opt in cust_info | filter: {Com: defcom.DefCom}: true">


  </select>
</div>

编辑:在更改组合之前保留原始值

angular.module("app", []).controller("MainCtrl", function($scope) {
$scope.test = "This is a test";
$scope.acct_info = [ 
.
.
.
(put this below your data definition)
$scope.defcom = $scope.acct_info[0];
var original_defcom = $scope.defcom;
var original_com = $scope.com;

请参阅plunker:http://plnkr.co/edit/YtdX0sBC4lHs0nX6D8Pu?p=preview

答案 1 :(得分:1)

您需要将选项的值设置为{{option.DefCom}},并为选择设置模型。然后使用该模型作为下一个选择的过滤器。您还需要使用ng-init来设置选择的当前值。

这里有一个Plunker给你: http://plnkr.co/edit/hIyz5pXpsoD2QpR8uo2o?p=preview