与jQueryvalidation绑定的单选选项不起作用

我使用knockout将对象列表绑定到select 。 对象类可以包含任意数量的属性

  

这非常viewModel.selectedCity().Name ,我可以使用viewModel.selectedCity().NameviewModel.selectedCity().Value加载子元素的viewModel.selectedCity().Value

我的问题是jQueryvalidation。 如果我保留上述语句,jQuery即使在选择后也不会重置错误。

我通过在bind中指定optionsValue来修复它,但是selectedCity返回标量值而不是整个对象。 任何想法如何保持对象行为或以不同方式进行validation?

   

未指定optionsValue时,错误仍然存​​在:

没有OptionsValue

这是我在selectedCity上的对象观察:

watch中的viewModel.selectedCity()返回一个对象

当指定optionsValue时, optionsValueselectedCity上的Object Watch:

使用OptionsValue

问题是当将对象作为值处理时, 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