Текст опции становится строкой функции после обновления с fromJS - PullRequest
2 голосов
/ 19 марта 2012

Почему текст опции преобразуется в строку функции после обновления значений из 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);

Обратите внимание, что после нажатия кнопки обновления текст опции становится функцией.

1 Ответ

3 голосов
/ 19 марта 2012

Данные, прошедшие через плагин сопоставления, теперь превратили Name и Id в наблюдаемые.Таким образом, когда ваша функция выполняет '[' + item.Id + '] ' + item.Name, вы объединяете строки с наблюдаемыми (которые являются функциями).

Если Name и Id всегда являются наблюдаемыми, тогда вы захотите сделать:

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

Если вы хотите поддерживать наблюдаемые или ненаблюдаемые, то вы можете сделать что-то вроде:

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

ko.utils.unwrapObservableбудет правильно возвращать значение для наблюдаемого или ненаблюдаемого.

...