我有两个选择下拉列表,其中第二个选项中的选项取决于在第一个选择中选择的选项。
目前我正试图找出应该从服务器返回数据的方式,这取决于我设置filter(s)
的方式。
对于使用多个选择下拉菜单过滤数据结构时的最佳做法,我将不胜感激。
以防万一我正在开发/测试当前稳定版本的AngularJS(v1.3.15)。
$scope.optionObjs = [
{
id: 1, name: 'option 1', desc: '',
elements: [
{ id: 9, name: 'option 11', desc: '', },
{ id: 10, name: 'option 12', desc: '', },
{ id: 11, name: 'option 13', desc: '', },
{ id: 12, name: 'option 14', desc: '', },
{ id: 13, name: 'option 15', desc: '', },
],
},
];
我希望在我的html中使用类似下面示例的角度过滤器,但这似乎不起作用。
<select data-ng-model="firstSelect" data-ng-options="option.name for option in optionObjs"></select>
<select data-ng-model="secondSelect" data-ng-options="option.elements.name for option in optionObjs | filter:firstSelect"></select>
<select data-ng-model="firstSelect" data-ng-options="option.name for option in optionObjs"></select>
<select data-ng-model="secondSelect" data-ng-options="option.name for option in firstSelect.elements"></select>
就是这样。 D'哦!!!
$scope.optionObjs = [
{ id: 1, parent: null, name: 'option 1', desc: '', },
{ id: 9, parent: 1, name: 'option 11', desc: '', },
{ id: 10, parent: 1, name: 'option 12', desc: '', },
{ id: 11, parent: 1, name: 'option 13', desc: '', },
{ id: 12, parent: 1, name: 'option 14', desc: '', },
{ id: 13, parent: 1, name: 'option 15', desc: '', },
];
继续这个例子,我必须为第一个选择编写一个过滤器,以便只显示那些没有父引用的选项。
<select data-ng-model="firstSelect" data-ng-options="option.name for option in optionObjs | filter:parent=null"></select>
<select data-ng-model="secondSelect" data-ng-options="option.elements.name for option in optionObjs | filter:firstSelect"></select>
考虑到@adamjld的建议并使用Angular filter
进行更多实验,我提出了以下html更新,以配合上述数据结构(无需自定义过滤功能)
<select data-ng-model="firstSelect" data-ng-options="option.name for option in optionObjs | filter : { parent: null, }"></select>
<select data-ng-model="secondSelect" data-ng-options="option.elements.name for option in optionObjs | filter : { parent: firstSelect.id, }"></select>
虽然这是一个更简单的解决方案,但在初始加载时会出现轻微问题。因为我没有将firstSelect
初始化为我的控制器中的作用域对象,所以第二个选择框允许用户选择他们想要的任何选项。但是,只要在第一个选择框中选择了一个选项,第二个选择框选项就会被过滤,只显示(父)firstSelect.id
的相应选项。
以防人们开始抱怨我根本没有使用搜索这里有一些参考:
angular filter
ng-repeat :filter by single field
答案 0 :(得分:4)
我认为这会做你正在寻找的东西..我编辑了数据,以显示它运作得更好。我将您的数据拆分为两个数组,父和子。
$scope.parentOptionObjs = [{
id: 1,
name: 'option 1',
desc: ''
}, {
id: 2,
name: 'option 2',
desc: ''
}];
$scope.childOptionObjs = [{
parent: 1,
id: 9,
name: 'option 11',
desc: ''
}, {
parent: 1,
id: 10,
name: 'option 12',
desc: ''
}, {
parent: 1,
id: 11,
name: 'option 13',
desc: ''
}, {
parent: 2,
id: 12,
name: 'option 14',
desc: ''
}, {
parent: 2,
id: 13,
name: 'option 15',
desc: ''
}];
});
现在使用以下过滤器通过父项的ID过滤子项。
app.filter('secondDropdown', function () {
return function (secondSelect, firstSelect) {
var filtered = [];
if (firstSelect === null) {
return filtered;
}
angular.forEach(secondSelect, function (s2) {
if (s2.parent == firstSelect) {
filtered.push(s2);
}
});
return filtered;
};
});
答案 1 :(得分:0)
在第一个下拉列表中设置ng-model 选择ng-model =“drp1Value”
在第二个下拉列表中选择 ng-disabled =“drp1Value == null”