У меня есть реактивная форма, над которой я работаю, и вам нужно решить проблему. Проблема в том, что мои пользователи используют планшеты/сотовые телефоны по более медленным соединениям сотовой связи, а иногда и к свободному соединению. Когда соединение будет восстановлено, 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? Или есть просто лучший метод/образец, за которым я мог бы следовать, что сделало бы эту работу лучше?
Итак, я читал вверх на ViewModel. Я думаю, что это именно то, что мне нужно. Единственное зависание, которое у меня есть при обмене, - это я не понял способ обработки привязки, когда значение может быть массивом элементов, например, когда у вас есть куча флажков. Их пример для привязки checkbox предполагает наличие одной виртуальной машины для каждого флажка. – CodeChimp
Я пропустил случай привязки нескольких флажков к массиву. Я обновлю ViewModel. Это простое решение. – Manuel
Обновление до версии 1.3.2 и см. Http://viewmodel.meteor.com/#checkedMultipleBk – Manuel