使用Knockout.js在网格中创建依赖下拉列表
Creating dependent dropdowns in a grid using Knockout.js
我正试图创建一个包含两个下拉列的数据绑定表。但是,右侧下拉列表中可用的选项取决于左侧下拉列表中选择的内容。例如,假设DropdownA
有一个州列表,DropdownB
有一个该州的城市列表。我的模板如下:
<!-- ko foreach: MeasurementInfoPlans -->
<tr>
<td><select id="DropdownA" data-bind="options: $root.AllStates, optionsValue: 'State', optionsText: 'Name', value: StateId"></select></td>
<td><select id="DropdownB" data-bind="options: $root.AllCities, optionsValue: 'City', optionsText: 'Name', value: CityId"></select></td>
</tr>
<!-- /ko -->
现在,DropdownB
显示$root.AllCities
中的每一项。但是,我希望它仅显示具有State
属性的城市,无论在DropdownA
中选择什么值。
我在网上找到了各种关于如何使用计算的可观察项定义依赖下拉列表的示例,但是这些示例假设您只有一个源下拉列表(如State(。在我的情况下,我需要在网格中创建任意数量的下拉对。有人举过这样做的例子吗?
我会将城市放在state
对象上,然后将它们作为行项目上的computed
进行跟踪,因为它将具有可观察的状态选择。这是一把小提琴
html:
<select data-bind="options: $parent.states,
optionsText: 'name',
value: state"></select>
<select data-bind="options: cities, value: city"></select>
js:
self.state = ko.observable("");
self.city = ko.observable("");
self.cities = ko.computed(function(){
if(self.state() == "" || self.state().cities == undefined)
return [];
return self.state().cities;
});
我想到了两个解决方案:
- 在视图模型中订阅
DropdownA
的observableArray,并随时替换DropdownB
的observaleArray中的城市范围 - 使用可观察的数据上下文:使用可观察作为选项源,这样您也可以在需要时更改它。与第一个一样订阅
DropdownA
,并在其更改时替换整个城市集合
我会选择第二个,因为那更干净。
这是我为你做的一个jsfiddle样品。
Html:
<select data-bind="options: dropdownA, value: dropdownAValue">
</select>
<select data-bind="options: dropdownB">
</select>
Js:
var viewModel = function() {
var _this = this,
dataSource1,
dataSource2;
dataSource1 = ["Hello"];
dataSource2 = ["World"];
_this.dropdownA = ko.observableArray(["A", "B"]);
_this.dropdownB = ko.observable(dataSource1);
_this.dropdownAValue = ko.observable();
_this.dropdownAValue.subscribe(function() {
if (_this.dropdownAValue() == "A") {
_this.dropdownB(dataSource1);
} else {
_this.dropdownB(dataSource2);
}
});
};
ko.applyBindings(new viewModel());
然后,可以很容易地在多行中使用这个概念:http://jsfiddle.net/jGRQH/
Html:
<table data-bind="foreach: rows">
<tr>
<td>
<select data-bind="options: $root.dropdownA, value: dropdownAValue">
</select>
</td>
<td>
<select data-bind="options: dropdownB">
</select>
</td>
</tr>
</table>
Js:
var rowViewModel = function(dataSource1, dataSource2) {
var _this = this;
_this.dropdownB = ko.observable(dataSource1);
_this.dropdownAValue = ko.observable();
_this.dropdownAValue.subscribe(function() {
if (_this.dropdownAValue() == "A") {
_this.dropdownB(dataSource1);
} else {
_this.dropdownB(dataSource2);
}
});
};
var mainViewModel = function() {
var _this = this,
dataSource1,
dataSource2,
addRow;
dataSource1 = ["Hello"];
dataSource2 = ["World"];
addRow = function () {
_this.rows().push(new rowViewModel(dataSource1, dataSource2));
};
_this.rows = ko.observableArray();
_this.dropdownA = ko.observableArray(["A", "B"]);
addRow();
addRow();
addRow();
};
ko.applyBindings(new mainViewModel());
相关文章:
- 要求创建空模块作为依赖项加载程序
- 如何创建js常量对象与"依赖/相对;价值观
- 如何在php中创建依赖的下拉列表
- 创建一个不依赖于Snap实例的组
- 如何根据电子邮件模板名称的选择创建依赖的同义词文本区域
- 如何创建一组从属选择列表,其中连续列表依赖于前面列表选项的选择
- 如何在骨干木偶中创建依赖DOM的元素
- 创建依赖下拉列表
- 如何在代码点火器中创建依赖下拉列表
- Webpack:如何为“webpack”创建一个加载器,它需要一系列依赖项
- 有关创建相互依赖的异步调用的建议
- 在 Reactjs 中创建依赖字段
- 创建一个依赖于可观察量“树”的 Knockout 绑定处理程序
- 是否使用依赖注入模式来创建专业代码
- Knockout computed为写入但未读取的可观察项创建依赖项
- 如何使用PHP在HTML中创建依赖登录的菜单
- Webpack:使用另一个依赖而不是它自己的子依赖来创建依赖
- 如何创建依赖于普通变量、函数或逻辑的ember属性
- 在我的表单中创建依赖字段
- 使用Knockout.js在网格中创建依赖下拉列表