Knockout Mapping - fromJS - не удается на простом примере

Я пытаюсь выяснить, что я не понимаю, с библиотекой картографии Knockout. Я сократил его до простого примера, и все же могу заставить его потерпеть неудачу (скорее, не обновить с помощью сопоставленных переменных) с помощью вызова fromJS.

Что я ошибаюсь в этом примере?

// Here's my view model
var ViewModel = function() {
    this.firstName = ko.observable('first');
    this.lastName = ko.observable('last');
};

var myVM = new ViewModel();

ko.applyBindings(myVM); // Apply to Knockout (works)

myVM.lastName('maiden name'); // Test an update (works)

var newData = {firstName: 'new', lastName: 'person'};

// Try update the ViewModel
ko.mapping.fromJS(newData, myVM); //(No update, or error)

// Intended result - UI updates to 'new person'

И соответствующий вид:

<div class='liveExample' >   
    <p>First name: <input data-bind='value: firstName' /></p> 
    <p>Last name: <input data-bind='value: lastName' /></p> 
</div>

Мой пример скрипта JS.


person Overflew    schedule 12.09.2013    source источник


Ответы (2)


ko.mapping.fromJS обрабатывает параметры немного сложно (см. Мой ответьте здесь), поэтому вторым параметром обычно являются параметры сопоставления:

ko.mapping.fromJS(newData, {} /* mapping options */, myVM); 

Демо-версия JSFiddle.

person nemesv    schedule 12.09.2013
comment
Действительно сложно! Я бы боролся, как @Overflew - person I.G. Pascual; 12.09.2013
comment
Спасибо @nemesv. Документы Knockout Mapping по адресу knockoutjs.com/documentation/plugins-mapping.html, безусловно, отправлены я пошел по неправильному пути. Перечитываю, все еще пытаюсь понять, в каком контексте правильно называть двухпараметрическую версию ... - person Overflew; 12.09.2013
comment
Ах, теперь я понял - Спасибо за объяснение аргумента 1/2/3 в другом связанном ответе. - person Overflew; 12.09.2013

Я нашел, как использовать только 2 параметра данных.

Создайте модель представления как сопоставление исходных данных, затем используйте ko.mapping.fromJS(data, ViewModel).

ОБНОВЛЕННЫЙ jsFiddle

Объяснение

Knockout использует свойство mappingProperty = "__ko_mapping__", чтобы определить, когда данные были ранее сопоставлены. Если он найден, он установит второй параметр в качестве целевого (в данном случае ViewModel).

Выдержка из отладочной версии ko.mapping.js:

var mappingProperty = "__ko_mapping__";

[...]

if (arguments.length == 2) {
  if (arguments[1][mappingProperty]) {
    target = arguments[1];
  } else {
    options = arguments[1];
  }
} 
person I.G. Pascual    schedule 12.09.2013