Как я могу переопределить фильтрацию Angular недопустимых значений формы, заставляя Angular сохранять $ viewValue в $ modelValue?

Мне нужно иметь возможность временно сохранять данные, которые нееще не полностью утвержден, затем выполните проверку, когда яЯ готов сделать это постоянным. Но Angular препятствует этому.

У меня есть форма. Пользователь можетsaveDraft() в ранних версиях формы, которые сохраняются на сервере. Затем, когда пользователь готов, они могутsubmit() форма, которая сохранит ее с разными флагами, тем самым начав фактическую обработку этих данных.

Проблема янатыкаюсь на ангулярвстроенные проверки. Когда пользователь вводит некоторые данные во входные данные с проверками на них, эти данные кэшируются на$viewValue имущество. Но если проверка не удалась, это 'S никогда не копируется в$modelValue свойство, которое является ссылкой на фактическое$scope свойство, к которому я привязал вход. И, следовательно,недействительным' значение не будет сохраняться.

Но мы должны упорствовать. Мы'Я постараюсь заставить пользователя исправлять свои ошибки проверки позже, когда они отправят (). Кроме того, у нас нет возможности узнать, собирается ли пользовательsaveDraft() или жеsubmit() на конкретном экземпляре представления / контроллера, поэтому мы можем '• предварительно настроить представления и проверки по-разному.

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

мы пробовали установку$scope.formName.inputName.$modelValue = $scope.formName.inputName.$viewValue, но это, кажется, просто расстраивает богов, так как оба значения тогда равны нулюed.I»

мы пытались использовать$scope.formName.inputName.$setValidity('', true), но это только обновляет состояние пользовательского интерфейса. Это никогда не трогает.$modelValue

Я могу успешно использовать$scope.model.boundPropertyName = $scope.formName.inputName.$viewValue но это чувствует себя очень необходимым и победилt разрешить любое расхождение между идентификаторами дляboundPropertyName а такжеinputName, Другими словами, вам либо нужны отдельные функции для всех элементов управления формы, либо вы должны полагаться на соглашения об именах. Оба из которых очень хрупкие.

Итак ... как я могу получить это$modelValue обновлено элегантно? И / или есть ли другой, лучший способ получить те же результаты, при которых иногда я могу продолжать с проверкой, а иногда без?

Другие варианты яЯ рассматриваю, но не доволен:

Запустите проверку вручную, только когда пользователь нажимает submit (). Но это побеждает значение UX мгновенной встроенной проверки в пользовательском интерфейсе. С таким же успехом мы могли бы просто переложить всю валидацию на сервер и каждый раз совершать обходные действия.Сделайте копии ngModel и ngModelController и сделайте обезьяны-патчи для обновления$modelValue независимо от действительности. Но это взламывает структуру, когда должен быть более элегантный путь.

Смотрите CodePen здесь.

(Примечание: Angular, по-видимому, фильтрует данные в соответствии соба направления, Если вы установите значение по умолчанию для модели для formData.zip из '1234'который неДостаточно символов для проверки, Angular недаже не показывай. Никогда не достигает начального$viewValue.)

Ответы на вопрос(4)

Ваш ответ на вопрос