gpt4 book ai didi

javascript - 显示基于 Angular 中另一个选择的选项列表

转载 作者:数据小太阳 更新时间:2023-10-29 04:45:57 25 4
gpt4 key购买 nike

我有两个选择下拉菜单,其中第二个选择中的选项取决于第一个选择中选择的选项。

目前,我正在尝试弄清楚应该以何种方式从服务器返回数据,这取决于我设置过滤器的方式。

对于使用多选下拉列表过滤数据结构的最佳实践,我将不胜感激。

以防万一我正在使用当前稳定版本的 AngularJS (v1.3.15) 开发/测试的人对此感兴趣。

数据结构 1 - 嵌套:

$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 中像下面的示例那样使用 Angular 过滤器,但这似乎没有用。

<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>

更新:

好吧,这对我来说太傻了。要使上述数据结构符合我的要求,只需简单更改为第二个选择的 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.name for option in firstSelect.elements"></select>

就是这样。哦!!!

数据结构 2 - 带父引用:

$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 初始化为我的 Controller 中的作用域对象,所以第二个选择框允许用户选择他们想要的任何选项。但是,一旦在第一个选择框中选择了一个选项,第二个选择框选项就会被过滤,并且只显示与(父级)firstSelect.id 对应的选项。

引用资料

为了防止人们开始提示我根本没有使用搜索,这里有一些引用资料: angular filter
ng-repeat :filter by single field

最佳答案

我认为这会满足您的需求。我编辑了数据以显示它工作得更好一些。我将您的数据分成两个数组,一个父数组和一个子数组。

$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;
};
});

Fiddle

关于javascript - 显示基于 Angular 中另一个选择的选项列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30638183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com