级联选择/下拉菜单

Posted

技术标签:

【中文标题】级联选择/下拉菜单【英文标题】:Cascading select/dropdowns 【发布时间】:2013-09-14 10:15:43 【问题描述】:

我正在尝试使用 AngularJS 创建一个链式/级联下拉菜单(选择元素),但我在使用我的对象属性过滤和更新“选定”属性时遇到了困难。

当页面首次加载时,所选项目会被过滤并正确显示在下拉列表中。更改父下拉列表后,子选择项不会抓取过滤列表中的第一项,从而导致孙下拉列表不更新。

任何见解将不胜感激,并注意我将父/子/孙数组分开(而不是在子数组中),因为我最终将从 SQL 中的单独 spocs/表中提取我的数据。如果有一种简单的方法可以在 JSON 中创建子数组,那么我愿意更改数据结构。

这是 a link 的代码示例

HTML

<div ng-controller="dropdownCtrl" >                    
  <div>
     <select 
       ng-model="selectedParentItem"                        
       ng-options="p.displayName for p in parentItems">                        
     </select>
  </div>
  <div>
     <select                                                    
       ng-model="selectedChildItem"                     
       ng-options="c.displayName for c in filteredArray | filter:parentId:           
         selectedParentItem.id">                        
     </select>
  </div>
  <div>
     <select                                                    
       ng-model="selectedGrandChildItem"                        
       ng-options="g.displayName for g in grandChildItems | filter:parentId: 
         selectedChildItem.parentId">                        
     </select>
  </div>
</div>

控制器

function dropdownCtrl($scope, filterFilter) 
$scope.parentItems = [
    
        "id": 0,
        "displayName": "parent 00"
    ,
    
        "id": 1,
        "displayName": "parent 01"
    ,
    
        "id": 2,
        "displayName": "parent 02"
    
  ];
$scope.selectedParentItem = $scope.parentItems[0];

$scope.childItems = [
    
        "id": 0,
        "displayName": "child0 of 00",
        "parentId": 0
    ,
    
        "id": 1,
        "displayName": "child1 of 00",
        "parentId": 0
    ,
    
        "id": 2,
        "displayName": "child2 of 00",
        "parentId": 0
    ,
    
        "id": 3,
        "displayName": "child0 of 01",
        "parentId": 1
    ,
    
        "id": 4,
        "displayName": "child1 of 01",
        "parentId": 1
    ,
    
        "id": 5,
        "displayName": "child0 of 02",
        "parentId": 2
    
];
$scope.filteredArray = [];
$scope.$watch("parentId", function (newValue) 
    $scope.filteredArray = filterFilter($scope.childItems, newValue);
    $scope.selectedChildItem = $scope.filteredArray[0];
,true);


$scope.grandChildItems = [
    
        "id": 0,
        "displayName": "grandChild0 of 00",
        "parentId": 0
    ,
    
        "id": 1,
        "displayName": "grandChild1 of 00",
        "parentId": 0
    ,
    
        "id": 2,
        "displayName": "grandChild2 of 00",
        "parentId": 0
    ,
    
        "id": 3,
        "displayName": "grandChild0 of 01",
        "parentId": 1
    ,
    
        "id": 4,
        "displayName": "grandChild1 of 01",
        "parentId": 1
    ,
    
        "id": 5,
        "displayName": "grandChild0 of 02",
        "parentId": 2
    
];
$scope.selectedGrandChildItem = $scope.grandChildItems[0];

【问题讨论】:

【参考方案1】:

你不需要看这个..它比那更容易。注释掉过滤器,然后更改您的 ng-option,如下所示。请注意,您的最后一个过滤器看起来使用了错误的父 ID(第三个下拉框是否与其父或祖父相关?)

<select
    class="form-control"
    ng-model="selectedParentItem"
    ng-options="p.displayName for p in parentItems">
</select>

<select
    class="form-control"
    ng-model="selectedChildItem"
    ng-options="c.displayName for c in childItems | filter:parentId: selectedParentItem.id">
</select>

<select
    class="form-control"
    ng-model="selectedGrandChildItem"
    ng-options="g.displayName for g in grandChildItems | filter:parentId: selectedChildItem.parentId">
</select>

【讨论】:

这就是我之前让孩子下拉的方式,而不是使用“filteredArray”数组,而是使用 $scope.selectedChildItem = $scope.childItems[0]。这会产生与原始结果相同的结果,但我希望将过滤列表中的第一项分配为 $scope.selectedChildItem。 不确定我是否听懂了你的意思……你想要这样的东西吗? link 这取决于所有三个数组中的第一项一起作为您的默认选项。 很抱歉给您带来了困惑。最终,我希望任何“子”下拉列表进行过滤,并在父下拉列表更改时选择过滤列表中的第一项。我的 jsFiddle 示例正确进行了过滤,但将子下拉列表留空,而不是显示第一项。前任。将父下拉列表从“父 00”更改为“父 01”。右侧的下拉列表已将其原始数组过滤为“child0 of 01”和“child1 of 01”,但初始选择为空白。我希望选择“child0 of 01”,以便孙子下拉菜单也将过滤(并选择“grandChild0 of 01”)。 Example I tried to mirror 但不起作用 哦,好吧,然后回到手表上。对不起这里的圈子。也许就是这样? link

以上是关于级联选择/下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 级联下拉菜单

如何在不弄乱下拉值的情况下使 Angular Reactive Formarray 中的级联下拉菜单工作

在 s-s-rS 报告中使用级联多选下拉菜单时,取消选中所有复选框不起作用

yii实现级联下拉菜单的方法

级联下拉菜单在 mvc 中返回未定义

带有 jQ​​uery 的 Rails 中的动态下拉(选择框)菜单不可逆