#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.