看看Data-linked <select> elements - 包括<select> with converters部分。
您的代码:
<select id="cboHarbor" data-link="{{getName:activeHarbor}}">
不正确。您需要数据链接到 activeHarbor。如果 activeHarbor 是一个字符串,您可以使用以下方式进行数据链接:
<select id="cboHarbor" data-link="activeHarbor">
但由于它是一个对象,因此您需要为每个港口对象提供某种字符串值属性,然后您可以将其用于每个选项值。然后,您将使用转换器在 activeHarbor 对象及其字符串值属性之间来回转换,以实现数据链接绑定行为。
例如,您可以使用当前语言中的名称作为字符串值,但是使用根据当前语言而变化的值有点奇怪。但是您需要一个getHarbor 转换器来转换回从名称到港口对象的获取。看起来像这样:
<select id="cboHarbor" data-link="{getName:activeHarbor:getHarbor}">
{^{for harbors}}
<option data-link="{getName:}"></option>
{{/for}}
</select>
或者,您可以使用数组中港口的索引,如下所示:
<select id="cboHarbor" data-link="{getIndex:activeHarbor:getHarbor}">
{^{for harbors}}
<option value="{{:#index}}" data-link="{getName:}"></option>
{{/for}}
</select>
使用如下转换器:
$.views.converters({
getIndex: function (harbor) {
return harbor.index;
},
getHarbor: function (index) {
return data.harbors[index];
},
getName: function (harbor) {
return harbor.name[data.languages[data.currentLanguage]];
}
});
如果您希望能够动态更改语言并让 Harbors 下拉菜单切换到新语言,则必须使您的 getName 转换器依赖于当前语言,如下所示:
$.views.converters.getName.depends = [data, "currentLanguage"];
这是一个 updated version of your jsfiddle 完整的语言下拉菜单以切换语言。
更新:
关于getName 的depends,modified jsFiddle 有这个:
function getName(harbor) {
return harbor.name[data.languages[data.currentLanguage]];
}
$.views.converters({
getName: getName,
...
});
getName.depends = [data, "currentLanguage"];
因此,您可以简单地使用 getName 函数作为转换器函数,然后在您可以访问数据实例的上下文中(如果需要异步,则在 done() 中),然后分配取决于:
getName.depends = [data, "currentLanguage"];
无需使用$.views.converters.getName.depends