2015-03-10 4 views
0

У меня есть реактивная форма, над которой я работаю, и вам нужно решить проблему. Проблема в том, что мои пользователи используют планшеты/сотовые телефоны по более медленным соединениям сотовой связи, а иногда и к свободному соединению. Когда соединение будет восстановлено, Meteor закроет все сообщения DDP, тем самым активируя реактивность в форме и, таким образом, перезапишет любой входной сигнал, который пользователь выполнил, но не сохранил.Отключение реактивности во время редактирования поля

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

Это отлично подходит для нетекстовых полей, таких как переключатели и флажки, но для текстовых входов это не работает.

Проблема, похоже, связана с реактивностью. Так как типы пользователей, у меня есть еще обработчик установлен на change и keydown (я также попытался keypress и keyup), который просто запускает обновление значений временных, как это:

'change .responseInput, keydown .responseInput': function(event, tmpl) { 
    var response = Blaze.getData(tmpl.$('.headerDiv')[0]); 
    var val = response.lastResponseValue; 
    if (!val) { 
    val = new ResponseValue({ 
     response_id: response.id 
    }); 
    } 
    val.tempValues = getSelectedValues(tmpl.$('div.responseDiv')); 
    val.save(); 
} 

В этом обработчике события response.lastResponseValue просто возвращает последнее значение ответа (я поддерживаю историю значений, вводимых пользователем), и getSelectedValues() принимает элемент DOM, представляющий DIV, вокруг элемента управления формой и выдает выбранные значения, которые могут быть одиночными String для текстового поля или текстового поля или массив значений String для флажков. Эти части работают так, как ожидалось.

Что не работает val.save(). При выборе поля ввода текста и быстро набрав, опыт заключается в том, что напечатанный текст случайно пропускается/игнорируется/удаляется, скорее всего, из-за реактивности. Я попробовал обернуть обработчик события в Tracker.nonreactive(), чтобы отключить реактивность, но это, похоже, не помогает. Я предполагаю, потому что это не save(), это реактивный, а скорее find().

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

Есть ли способ временно отключить реактивность на документе в Meteor/Blaze? Или есть просто лучший метод/образец, за которым я мог бы следовать, что сделало бы эту работу лучше?

ответ

0

Элементы вашей формы не должны быть подключены к каким-либо реактивным значениям вообще, в противном случае они будут уничтожены так же, как вы видите, а также во время нажатия горячего кода.

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

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

Посмотрите на это, он обрабатывает все это с легкостью:

http://viewmodel.meteor.com/

Tim

+0

Итак, я читал вверх на ViewModel. Я думаю, что это именно то, что мне нужно. Единственное зависание, которое у меня есть при обмене, - это я не понял способ обработки привязки, когда значение может быть массивом элементов, например, когда у вас есть куча флажков. Их пример для привязки checkbox предполагает наличие одной виртуальной машины для каждого флажка. – CodeChimp

+0

Я пропустил случай привязки нескольких флажков к массиву. Я обновлю ViewModel. Это простое решение. – Manuel

+0

Обновление до версии 1.3.2 и см. Http://viewmodel.meteor.com/#checkedMultipleBk – Manuel

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