Мне нужно иметь возможность временно сохранять данные, которые еще не полностью проверены, а затем принудительно выполнить проверку, когда я готов сделать ее постоянной. Но Angular предотвращает это.
У меня есть форма. Пользователь может saveDraft()
на ранних версиях формы, которые сохраняются на сервере. Затем, когда пользователь готов, они могут submit()
форму, которая будет сохраняться с разными флагами, тем самым начнув фактическую обработку этих данных.
Проблема, с которой я столкнулся, - это встроенные проверки Angular. Когда пользователь вводит некоторые данные во входные данные с проверками на нем, эти данные кэшируются в свойстве $viewValue
. Но если проверка не удалась, она никогда не копировалась в свойство $modelValue
, которое является ссылкой на фактическое свойство $scope
, которое я связал с входом. И, следовательно, значение "недопустимое" не будет сохранено.
Но нам нужно упорствовать. Мы будем иметь дело с принуждением пользователя к исправлению ошибок проверки позже, когда они отправят(). Кроме того, у нас нет способа узнать, будет ли пользователь отправляться в saveDraft()
или submit()
на конкретный экземпляр представления/контроллера, поэтому мы не можем предварительно настроить представления и проверку по-разному заранее.
Мое мышление состоит в том, что нам нужно как-то перебрать элементы формы и получить Angular, чтобы как-то пропускать данные. Но я не могу найти такой гибкий и масштабируемый способ.
Я пробовал настройку $scope.formName.inputName.$modelValue = $scope.formName.inputName.$viewValue
, но это, похоже, просто расстроило богов, так как оба значения затем нуль.
Я пробовал использовать $scope.formName.inputName.$setValidity('', true)
, но это только обновляет состояние пользовательского интерфейса. Он никогда не касается $modelValue
.
Я могу с успехом использовать $scope.model.boundPropertyName = $scope.formName.inputName.$viewValue
, но это очень важно и не допускает никакой разницы между идентификаторами для boundPropertyName
и inputName
. Другими словами, вам либо нужны индивидуальные функции для всех элементов управления формами, либо вам нужно полагаться на соглашения об именах. Оба они супер-хрупкие.
Итак... как я могу получить этот $modelValue
элегантный? И/Или, есть ли другой, лучший способ получить те же результаты, что иногда я могу упорствовать с проверкой, а иногда и упорствовать без?
Другие варианты, которые я рассматриваю, но не довольны:
- Запустить проверку вручную, только когда пользователь нажимает submit(). Но это поражает значение UX мгновенной встроенной проверки в пользовательском интерфейсе. Мы могли бы просто выгрузить всю валидацию на сервер и совершать туда-обратно каждый раз.
- Сделайте копии ngModel и ngModelController и обезьяны-патчи, чтобы обновить
$modelValue
независимо от действительности. Но это взламывает рамки, когда должен быть более элегантный путь.
(Боковое примечание: Angular, по-видимому, фильтрует данные в соответствии с валидатором в обоих направлениях. Если вы установите значение по умолчанию для модели для formData.zip из '1234', что недостаточно для символов validate, Angular даже не показывает его. Он никогда не достигает начального $viewValue
.)