我有一个select
使用绑定绑定到复杂 javascript 对象列表的元素options
:
<select data-bind="options: availableCountries, optionsText: 'countryName', value: selectedCountry, optionsCaption: 'Choose...'"></select>
其中 availableCountries 是一个可观察的 javascript 对象数组。你可以在这个 fiddle中看到完整的例子。
现在,当我在列表中选择一个项目时,这可以正常工作。但是,如果我需要从应用程序的其他部分更新值,则只有在使用与 availableCountries 数组中完全相同的 Country 对象时才能执行此操作。这也已在这个相关问题中建立,但不幸的是它并没有解决我的问题。
在options binding的文档中,他们预料到了这个问题,并说我应该使用optionsValue
绑定:
通常,您只想使用 optionsValue 来确保 KO 在更新可用选项集时可以正确保留选择。例如,如果您通过 Ajax 调用反复获取“汽车”对象列表并希望确保保留所选汽车,您可能需要将 optionsValue 设置为“carId”或每个“汽车”对象具有的任何唯一标识符, 否则 KO 不一定知道之前的“汽车”对象中的哪些对应于新对象中的哪些。
但不幸的是,这不起作用,因为它也会影响值绑定 - 如果我设置optionsValue
为'countryName'
,selectedCountry
将只包含国家/地区的名称而不是整个对象。
我正在寻找一种方法来结合这些。我仍然希望 value 是整个对象,但我希望选项值比较使用我指定的特定属性。基本上,是这样的:
<select data-bind="options: availableCountries, optionsText: 'countryName', optionsComparator: 'countryName', value: selectedCountry, optionsCaption: 'Choose...'"></select>
但是,据我所知,这涉及修改value
绑定。我还有其他选择吗?我可以用其他方式解决这个问题吗?扩展器?自定义绑定处理程序?