Как я клонирую и перепривязываю свои данные, используя отображение нокаута? - PullRequest
3 голосов
/ 09 февраля 2012

Мне нужно клонировать некоторые данные из основного источника в ViewModel в диалог. Причина в том, что пользователь может отменить диалог, и я не хочу, чтобы мастер отражал эти отмененные изменения.

Я создаю клонированную копию основных данных в диалоговом окне, и привязки данных устанавливаются так, чтобы подобрать свойства localEdited. *. Если пользователь нажимает «ОК», я пытаюсь сохранить данные обратно в мастер, если они отредактированы, в противном случае отправлять данные, если они новые.

   editItem: function(data) { 
            // clone a temporary copy for the dialog                    
            this.localEdited = ko.mapping.fromJS(ko.toJS(data));               
            $("#dlgAdd").dialog("open");
        },

Вышеуказанное в настоящее время работает, однако, если я щелкну другой элемент в мастере, диалоговое окно не будет отображать обновленные значения. Как будто ko.mapping.fromJS работает только один раз, а потом никогда. Он всегда подбирает первые значения. Как мне обойти эту проблему? Я чувствую, что мне нужно заново связать значения, но весь смысл нокаутом в том, что это не нужно делать.

Как мне также сохранить данные обратно в родительский. Я думаю, у меня может быть та же проблема, что и выше.

Кстати, я использую KnockoutJS 1.2.1.

1 Ответ

4 голосов
/ 09 февраля 2012

localEdited должен быть наблюдаемым, и вы должны сделать функцию this.localEdited(ko.mapping.fromJS(ko.toJS(data))) в editItem, чтобы заставить knockout перепривязывать ваш диалог при каждом вызове editItem. Привязки данных в диалоговом окне необходимо изменить на localEdited (). *

Вы можете обойтись без наблюдения localEdited, но в этом случае вам нужно будет вручную обновить каждое наблюдаемое свойство localEdited в функции editItem. Таким образом, вы должны иметь что-то вроде

this.localEdited.property1(data.property1());
this.localEdited.property2(data.property2());

Дело в том, что вам нужно обновить наблюдаемые, используя синтаксис вызова функций. Таким образом, нокаут поймает обновление и распространит его через привязки. В исходном коде вы просто делаете простое присвоение localEdited, поэтому у нокаута нет ловушки для перехвата и его магии.

UPDATE: Оказывается, плагин ko.mapping может обновлять отдельные наблюдаемые в вашей модели автоматически, поэтому вам не нужно делать это вручную:

ko.mapping.fromJS(ko.toJS(data), this.localEdited);
...