Отображение плагина нокаут [создание, обновление]: объекты, созданные, невозможно обновить
Я разместил свой код здесь: http://jsfiddle.net/HYDU6/6/ Это довольно урезанная версия того, с чем я на самом деле работаю, но она отражает суть моей проблемы. Моя модель представления выглядит так:
var viewModel = {
objects: {
foo: [
{ text: "Foo's initial" },
],
bar: [
{ text: "Bar's initial" },
]
}
}
Я использую ko.плагин mapping и мой обработчик create
для objects
создает экземпляры Obj
из objects.foo
, а затем objects.bar
, возвращая полученные два элемента в массив. Эта часть прекрасно работает; я использую
var view = {};
ko.mapping.fromJS(viewModel, mapping, view);
Моя проблема заключается в обновлении на основе новых данных. (то есть получение данных от сервера). У меня есть объект новых данных, и я пытаюсь
ko.mapping.fromJS(new_model, mapping, view);
Я подозреваю, что это неверно, но я не смог заставить его работать, несмотря на обширные поиски. (Поверь мне, прошло уже несколько дней. ): В любом случае, спасибо за любую помощь.
EDIT: так что я в основном понял это - я слишком сильно зависел от картографии.из-за этого и некоторые вещи не были завернуты в наблюдаемые. Я также понял, что мне не нужен create (), только update (), как он называется после create() в любом случае. Если у вас есть подобная проблема, дайте мне знать!
1 ответ:
Джон,
При обновлении данных с помощью ko.отображение убедитесь, что вы не создаете новый элемент. Ваш пользовательский интерфейс уже привязан к существующим элементам, поэтому вы просто хотите обновить значения существующих свойств элементов, а не создавать новые. Для примера, который вы опубликовали, вам нужно будет настроить свой метод "обновления" карты, чтобы вставить новые значения в правильный ko.наблюдаемое свойство, а не создание нового объекта на его месте. Нокаут.отображение" update " метод имеет несколько отличий список параметров в зависимости от использования, причем третьим параметром является целевой объект карты. Вы бы хотели обновить свойства этого объекта.
obj.target[label].items[0].text(obj.data[label][0].text);
Но, это немного беспорядок. Вы, вероятно, захотите создать второй уровень сопоставлений (create / update) для обработки "глубоких" иерархий объектов, как в вашей скрипке. Например, одна карта для объектов на уровне "foo / bar", а другая-для вызова ko.fromJS изнутри "обновить" с другой картой для дочернего объекта() объекты.
После исправления этой ошибки вы столкнетесь с парой простых ошибок привязки, которые можно исправить с помощью другой привязки "with" или привязки "foreach" для дочерних массивов.
В целом, вы только что столкнулись с парой распространенных ловушек, но ничего слишком серьезного. Вы можете узнать немного больше о некоторых из этих ловушек в моем блоге здесь: http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/Надеюсь, это поможет!