与jQueryvalidation绑定的单选选项不起作用
我使用knockout将对象列表绑定到select
。 对象类可以包含任意数量的属性
这非常viewModel.selectedCity().Name
,我可以使用viewModel.selectedCity().Name
或viewModel.selectedCity().Value
加载子元素的viewModel.selectedCity().Value
。
我的问题是jQueryvalidation。 如果我保留上述语句,jQuery即使在选择后也不会重置错误。
我通过在bind中指定optionsValue
来修复它,但是selectedCity
返回标量值而不是整个对象。 任何想法如何保持对象行为或以不同方式进行validation?
未指定optionsValue
时,错误仍然存在:
这是我在selectedCity
上的对象观察:
当指定optionsValue
时, optionsValue
是selectedCity
上的Object Watch:
问题是当将对象作为值处理时, option
元素的值设置为“”。 由于这个原因,jQueryvalidation失败了。 您可以编写绑定或包装器绑定到options
绑定,并将它们设置为一个值,但我不认为最好走这条路线。
一个不错的选择是存储值并使用dependentObservable来表示当前选定的对象。
这将是:
var viewModel = { cityList: [{ Name: "Madison", Value: "MSN" }, { Name: "Milwaukee", Value: "MKE" }, { Name: "Green Bay", Value: "GRB" }], selectedCityValue: ko.observable() }; viewModel.selectedCity = ko.dependentObservable(function() { var value = this.selectedCityValue(); return ko.utils.arrayFirst(this.cityList, function(city) { return city.Value === value; }); }, viewModel);
有一个绑定像:
示例: http : //jsfiddle.net/rniemeyer/EgCM3/
相当简洁的解决方案是将optionsAfrerRender参数添加到选项绑定。 假设在’selectedCity’对象中有一个字段’cityId’,您可以将其分配给选项值。 请根据您的示例检查以下解决方案:
使用这种方法,您将获得敲除选项绑定和jqueryvalidation。
上面的答案有一点需要注意。 第一个选择值绑定(“ – 选择city–”)将是未定义的,从而导致错误。
如果您修改代码来处理它,它将起作用。
注意:为了简洁起见,我已经从ViewModel中删除了除setOptionValue方法之外的所有内容。
为了扩展Robert的答案,我们可以通过允许用户传入正确属性的字符串,使得辅助函数适用于视图模型中的每个下拉列表,无论上下文数据绑定如何:
JS
self.setOptionValue = function(propId) { return function (option, item) { if (item === undefined) { option.value = ""; } else { option.value = item[propId]; } } };
HTML