我正在使用ASP.NET MVC,Web API和KnockOutJS来创建一个站点.使用Web API,我返回一个Location对象列表,它通过JQuery AJAX调用获取,并存储在observableArray中.
$.getJSON(baseLocationUri, function (data) {
$.each(data, function (key, val) {
self.locations.push(ko.mapping.fromJS(val));
});
});
Run Code Online (Sandbox Code Playgroud)
正在返回的数据的一个例子可能是这样的(修整为了简洁):[{"LocationId":1,"显示名称":"星巴克","地址":"123主街"}]
这工作正常,我在其他地方使用了相同的代码.
我还有一个多重选择列表,它绑定到observableArray.如果我以这种方式编写选择,使用'DisplayName'作为optionsText:,它可以正常工作:
<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: 'DisplayName'"></select>
Run Code Online (Sandbox Code Playgroud)
同样,如果我将DisplayName作为函数返回,它仍然有效:
<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: function (item) { return item.DisplayName }"></select>
Run Code Online (Sandbox Code Playgroud)
但是 - 如果我尝试添加另一个参数 - 它会失败.我在UI中看到的只是"未定义".
<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: function (item) { return item.DisplayName + ' | ' + item.Address }"></select>
Run Code Online (Sandbox Code Playgroud)
还有一件事.如果我删除AJAX调用和映射,并在JavaScript中创建一个observableArray的Location对象,那么最后一个代码就可以了.
我错过了什么?
你有没有尝试过 :
function (item) { return item.DisplayName() + ' | ' + item.Address() }
Run Code Online (Sandbox Code Playgroud)
因为ko.mapping.fromJS(val)将DisplayName和Address转换为observables.