Использование сопоставления нокаута с нокаутом validatedObservable

#knockout.js #knockout-mapping-plugin #knockout-validation

#knockout.js #нокаут-сопоставление-плагин #проверка нокаута

Вопрос:

Я борюсь с тем, как обновить мою связанную viewmodel из вызова ajax при использовании validatedObservable .

Ранее я получал исходные данные из вызова ajax и изначально привязывался следующим образом:

 self.quote = ko.mapping.fromJS(result.data, self.quoteMapping);

ko.applyBindings(self);
  

и когда пользователь что-то изменил в «цитате», я бы сделал еще один вызов ajax, передающий изменения, и возвратом от вызова ajax будет полная «цитата» (и мне нужно привести всю «цитату», так как изменение одного элемента на сервере quote can -побочные эффекты влияют на другие элементы, а также на другие свойства верхнего уровня, которые поэтому необходимо обновить в модели представления на стороне клиента), с помощью которой я бы обновил модель связанного представления (используя другую сигнатуру fromJS), таким образом:

 ko.mapping.fromJS(result.data, self.quote);
  

Однако теперь я хочу, чтобы модель представления была validatedObservable . Для начальной загрузки это довольно просто:

 self.quote = ko.validatedObservable(ko.mapping.fromJS(result.data, self.quoteMapping));

ko.applyBindings(self);
  

но я застрял на том, как обновить модель представления с помощью проверенной наблюдаемой

Я не могу использовать ko.mapping.fromJS(result.data, self.quote); потому что это обновит self.quote с помощью простого наблюдаемого, а не проверенного наблюдаемого, и, что неудивительно, это не работает.

Вот несколько очень упрощенных скриптов, чтобы проиллюстрировать проблему.

Простой наблюдаемый (который работает): https://jsfiddle.net/stevedavey/1tup0agt /

Проверенный наблюдаемый (которого нет): https://jsfiddle.net/stevedavey/yh233wht /

Я был бы признателен за любую подсказку относительно того, что мне нужно сделать, чтобы иметь возможность получить исправленную «цитату» из вызова ajax и обновить мою проверенную наблюдаемую с помощью сопоставления ko.

Я подозреваю, что я неправильно понимаю что-то фундаментальное.

Ответ №1:

Я не могу использовать ko.mapping.fromJS(result.data, self.quote); , потому что это обновит self.quote с помощью простого наблюдаемого, а не проверенного наблюдаемого, и, что неудивительно, это не работает.

Вы можете использовать ko.mapping.fromJS , вы просто делаете это неправильно. Найдите время, чтобы прочитать документацию плагина сопоставления — это всего одна страница, и даже не длинная.

Вы можете определить дополнительное поведение, передав объект options . В этом случае вы хотите настроить создание объекта с помощью create — как возврат проверенного наблюдаемого.

Я привожу пример документации с одним изменением:

 var mapping = {
    'children': {
        create: function(options) {
            return ko.validatedObservable(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);
  

Конечно, вы также можете использовать create на корневом уровне параметры сопоставления, но плагин сопоставления также позволяет вам быть более конкретным.

Примечание: попробуйте повторно использовать ту же функцию для инициализации и обновления вашей viewmodel. Нет реальной причины хранить две разные части кода, которые обновляют один и тот же наблюдаемый объект.

Комментарии:

1. Я знал, что делаю это неправильно! : D Мне просто нужен был толчок в правильном направлении (не придирчивость к отсутствию очевидного). Функции create в моем определении сопоставления ( self.QuoteMapping in ko.mapping.fromJS(result.data, self.quoteMapping) — см. Код в моем вопросе) возвращают наблюдаемые, так что это то, что я делаю неправильно.

2. Это подразумевалось как подталкивание. 😉 Чисто язвительный ответ не содержал бы указателя в правильном направлении.

3. Ну, да, это правда. 😉 У меня все еще есть еще одна проблема с использованием / синтаксисом, с которой вы могли бы меня подтолкнуть! Я могу заставить create дочерние объекты возвращать проверенную наблюдаемую, но как мне получить validatedObservable ее с верхнего уровня. Я обновил скрипку ‘Validated Observable’ комментариями, ссылающимися на ваше имя пользователя SO, указывающее, с чем я застрял. Приветствуются подталкивания (даже язвительные! ;> ).

4. @steve Вместо построения графа объектов с помощью плагина сопоставления, который быстро становится утомительным, создайте отдельные viewmodels, которые ссылаются друг на друга и позволяют им создавать себя с минимальным участием плагина сопоставления. Я полностью переписал вашу вторую скрипку. Теперь он имеет самодостаточную иерархию App -> Quote -> QuoteItem viewmodel. Смотрите: jsfiddle.net/yh233wht/38 . Я думаю, что это очень близко к тому, как вы должны это делать. Также обратите внимание на изменения представления.

5. Спасибо за помощь, это намного аккуратнее и работает в том, что касается добавления, но я все еще не понимаю, как извлечь validatedObservables из сопоставления. Я хочу иметь возможность вызывать, например, quote.isValid (возможно, я неправильно понимаю, но у меня сложилось впечатление, что проверка ko может обрабатывать «пузырьки» валидности в иерархии объектов), получать ошибки проверки из quote и, таким образом, отображать их в сводке проверки. Я подозреваю, что мне не хватает чего-то фундаментального в проверке ko.