KnockoutJS无法使用自定义optionsText:on ko.mapping.fromJS数据

时间:2013-07-13 02:19:54

标签: knockout.js

我正在使用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));
            });
        });

返回的数据示例可能如下所示(为简洁而修剪): [{“LocationId”:1,“DisplayName”:“Starbucks”,“Address”:“123 Main St。”}]

这很好用,我在其他地方使用过相同的代码。

我还有一个多重选择列表,它与observableArray绑定。如果我以这种方式编写选择,使用'DisplayName'作为optionsText:,它可以正常工作:

<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: 'DisplayName'"></select>

同样,如果我将DisplayName作为函数返回,它仍然有效:

<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: function (item) { return item.DisplayName }"></select>

但是 - 如果我尝试添加另一个参数 - 它会失败。我在UI中看到的只是“未定义”。

<select multiple="multiple" data-bind="options: locations, selectedOptions: selectedLocations, optionsText: function (item) { return item.DisplayName + ' | ' + item.Address }"></select>

还有一件事。如果我删除AJAX调用和映射,并在JavaScript中创建一个observableArray的Location对象,那么最后一个代码就可以了。

我错过了什么?

1 个答案:

答案 0 :(得分:5)

你试过了吗?

 function (item) { return item.DisplayName() + ' | ' + item.Address() }

因为ko.mapping.fromJS(val)将DisplayName和Address转换为observables。