2

为什么从 ko.mapping.fromJS 更新值后,选项文本会转换为函数字符串?

示例:http: //jsfiddle.net/tYnc6/24/

html:

<div>
    <select data-bind="options: items, value: selected, optionsText: function(item) { return ('[' + item.Id + '] ' + item.Name) }, optionsCaption: 'Choose...'"></select>
    <button data-bind="click: update">Update</button>
</div>

​ Javascript:

var mapping = {
        key: function(data) {
            return ko.utils.unwrapObservable(data.Id);
    }
};

viewModel = {
    items: ko.observableArray([
        {Name: 'foo', Id: '1'},
        {Name: 'bar', Id: '2'}
    ]),
    selected: ko.observable(),

    update: function() {
        data = [
            {Name: 'foo', Id: '1'},
            {Name: 'bar', Id: '2'},
            {Name: 'baz', Id: '3'}
        ];
        ko.mapping.fromJS(data, mapping, this.items);
    }
}
ko.applyBindings(viewModel);

请注意,按下更新后,选项文本变成了一个函数。

4

1 回答 1

3

通过映射插件传递的数据现在已经变成NameId可观察的。因此,当您的函数执行时'[' + item.Id + '] ' + item.Name,您正在将字符串与可观察对象(它们是函数)连接起来。

如果NameandId总是可观察的,那么你会想要做:

'[' + item.Id() + '] ' + item.Name()

如果您想支持 observables 或 non-observables,那么您可以执行以下操作:

'[' + ko.utils.unwrapObservable(item.Id) + '] ' + ko.utils.unwrapObservable(item.Name)

ko.utils.unwrapObservable将正确返回可观察或不可观察的值。

于 2012-03-18T23:28:20.497 回答