Отображение плагина нокаут [создание, обновление]: объекты, созданные, невозможно обновить


Я разместил свой код здесь: 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 3

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/

Надеюсь, это поможет!