如何使用Knockout JS数组映射根据输入条件使选择选项绑定默认值
How to make a select options binding default based on input conditions using a Knockout JS Array Map?
我正在使用Computed Observable
和Array Map
将数据绑定到选择选项。
使用下面的代码结构,如何在选择选项中将国家/地区设置为默认值?例如:如果用户来自Albania
,则将默认国家/地区设置为Albania
。请注意,我正在使用并需要选定的值作为另一个函数的参数。
完整代码:
(function(){
var self = this;
self.SelectedCountry = ko.observableArray([]);
self.CountryData = ko.observableArray([]);
$.getJSON('https://restcountries.eu/rest/v1/all', function(data){
self.CountryData(data);
});
function viewModel(){
// Add some possible logic to make country default based on input
// from user. E.g. If data.alpha3Code === '1234'
self.Countries = ko.computed(function () {
return ko.utils.arrayMap(CountryData(),
function (data) {
return {
Name: data.name + ' ' + data.capital,
value: data.alpha3Code
}
});
}).extend({notify: 'always'})
}
self.Location = ko.computed(function () {
if (self.SelectedCountry()) {
return ko.utils.arrayFilter(CountryData(), function (item) {
return item.alpha3Code === self.SelectedCountry().value;
});
}
});
ko.applyBindings(new viewModel());
})();
JSFiddle上的工作示例:
这里的代码有很多错误。
SelectedCountry
应该是可观测的,而不是可观测的数组- viewModel不是一个合适的构造函数,因此不应该用
new
调用(我只是完全去掉了它) - 您应该将
self
传递给applyBindings
- 您可能希望在所选绑定中使用
optionsValue: 'value'
self
应该初始化为一个空对象。this
是你完成它的全局对象。你可能想把它全部放在你的构造函数里- 你需要把
self
放在电脑的CountryData
前面 - Location应该只返回名称,而不是数组,因为如果没有定义
SelectedCountry
,则没有数组,并且[0]
中断
所有这些都解决了,您只需要设置SelectedCountry
的值,选择就会相应地更新。唯一的技巧是,你需要向select添加另一个绑定valueAllowUnset: true
,告诉它你选择的值可能不在那里(至少在加载数据之前不会在那里)。
(function() {
var self = {};
self.SelectedCountry = ko.observable('BHR');
self.CountryData = ko.observableArray([]);
$.getJSON('https://restcountries.eu/rest/v1/all', function(data) {
self.CountryData(data);
});
self.Countries = ko.computed(function() {
return ko.utils.arrayMap(self.CountryData(),
function(data) {
return {
Name: data.name + ' ' + data.capital,
value: data.alpha3Code
}
});
}).extend({
notify: 'always'
})
self.Location = ko.computed(function() {
if (self.SelectedCountry()) {
var match = ko.utils.arrayFilter(self.CountryData(), function(item) {
return item.alpha3Code === self.SelectedCountry();
})[0];
if (match) {
return match.name;
}
}
});
ko.applyBindings(self);
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<select data-bind="options: Countries, optionsText: 'Name', optionsValue: 'value', valueAllowUnset: true, value: SelectedCountry"></select>
<p>Welcome! You are from:</p> <span data-bind="text: Location()"></span>
相关文章:
- javascript对象操作:根据指定条件选择属性
- Jquery:当两个或多个条件为true时,选择一个元素
- 当选择不同的父母时,我如何使条件形式的孩子消失并清除
- JavaScript / jquery:如果选择了单选按钮并且数据属性符合条件,则添加类
- Jquery - 如果条件为真,则遍历选择器并执行某些操作
- jQuery选择器中的条件处理
- 根据条件选择JSon对象
- jQuery条件选择问题
- 带有jQuery Mobile的多个条件选择器
- 嵌入闪亮应用程序中的数据表的条件选择类型
- Jquery数据属性条件选择器
- 使用jQuery根据条件选择/取消选中单选按钮的问题
- Jquery中根据条件选择随机值
- Svg D3.js如何使用条件选择
- Javascript条件选择
- Jquery以ID为条件选择表单项
- 默认有条件选择下拉值
- 条件选择应该是非此即彼
- 如何根据条件选择文本区域的数量
- 根据某些条件选择选项