2012-05-16 3 views
2

Есть ли способ создать настраиваемое событие для valueUpdate, чтобы я мог отложить обновление моей модели до тех пор, пока объект не будет проверен/сохранен?Отложить обновление модели knockoutjs до подтверждения/сохранения

documentation говорит:

следующие строковые значения являются наиболее часто полезно выбор:

"изменение" ..., "KeyUp" ..., "..." нажатие клавиши, «afterkeydown» ...

, подразумевая, что возможны другие значения, но не указывая, где я могу найти полный список.

Я хочу иметь всплывающую форму (в скрытом div до нужного) с кнопкой отмены, которая заставляет форму удаляться без обновления модели. Модель должна обновляться только тогда, когда пользователь нажимает кнопку сохранения.

(я немного скопировал этот вопрос из here - это, кажется, я не единственный, кто хочет этого, но они не получили никакого ответа)

+1

Я понимаю, что у вас есть событие изменения. Тем не менее, я хотел предложить альтернативный шаблон, в котором вы используете структуру, которая позволяет вам объяснить, как значение: http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel- edits.html. –

+0

@RPNiemeyer IMHO, это должен быть ответ, а не комментарий :-) Это очень хороший шаблон, который, вероятно, имеет дополнительные варианты использования (это не значит, что возможность отключить события изменения не будет хорошей ошибкой) – rjmunro

+0

@RPNiemeyer есть ли способ получить плагин сопоставления (https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js) для генерации protectedObservables, а не обычных наблюдаемых по умолчанию? – rjmunro

ответ

0

Существует возможность подписаться на «beforeChange» поток уведомлений от наблюдаемого. Это дает вам возможность проверить значение до его изменения.

Самым очевидным способом решения проблемы валидации модели является использование значений «записываемых» значений. Это позволит вам включить вашу логику проверки

+0

Блокирование обновления по методу beforeChange, поэтому я могу потом разрешить его позже, когда пользователь хочет нажать «Сохранить», похоже, это довольно хакерский способ сделать это, особенно, поскольку я хочу заблокировать изменения в форме этого элемента формы, но не из обновления, полученного из других источников. – rjmunro

0

Вопреки тому, что документация предполагает, параметр valueUpdate не «определить, какой браузер событий KO следует использовать для обнаружения изменений» с по умолчанию является «изменение», это позволяет поставлять событие или список возможных событий, которые следует уловить в дополнение к «изменению», которое всегда попадает.

Соответствующий code является:

// Always catch "change" event; possibly other events too if asked 
var eventsToCatch = ["change"]; 
var requestedEventsToCatch = allBindingsAccessor()["valueUpdate"]; 
if (requestedEventsToCatch) { 
    if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names 
     requestedEventsToCatch = [requestedEventsToCatch]; 
    ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch); 
    eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch); 
} 

Такое поведение было фактически предложено и implimented в: https://github.com/SteveSanderson/knockout/issues/102 https://github.com/SteveSanderson/knockout/commit/843420a6f801b17dd357880b359a67fa53647999

Похоже Документы не обновлялись. Я бы предпочел, чтобы люди запрашивали изменения, если они этого хотят, и документы, чтобы сообщить им что-то вроде:

«список событий, мы рекомендуем включить« change », pass [], чтобы отключить автоматическое обновление модели»,

Смежные вопросы