В Angular у меня может быть такая форма:
<ng-form>
<label>First Name</label>
<input type="text" ng-model="model.first_name">
<label>Last Name</label>
<input type="text" ng-model="model.last_name">
</ng-form>
Внутри соответствующего контроллера я мог легко наблюдать за изменениями содержимого этой формы, например, так:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Вот угловой пример на JSFiddle .
У меня проблемы с выяснением, как сделать то же самое в Angular. Очевидно, у нас больше нет $scope
$ rootScope. Конечно, есть метод, с помощью которого можно сделать то же самое?
(ngModelChange)="onModelChange($event)"
атрибут для каждого ввода формы, чтобы выполнить это?Ответы:
UPD. Ответ и демо обновлены, чтобы соответствовать последнему Angular.
Вы можете подписаться на все изменения формы из-за того, что FormGroup, представляющая форму, предоставляет
valueChanges
свойство, которое является экземпляром Observerable:В этом случае вам нужно будет создать форму вручную с помощью FormBuilder . Что-то вроде этого:
Проверьте
valueChanges
в действии в этой демонстрации : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewисточник
valueChanges
эмиттер событий , если эта форма определяются исключительно в шаблоне? Другими словами - в конструкторе компонента невозможно получить ссылку на форму, которая была определена исключительно в шаблоне этого компонента, а не с помощью FormBuilder?@ViewChild()
. Смотрите мой обновленный ответ.Если вы используете
FormBuilder
, смотрите ответ @ dfsq.Если вы не используете
FormBuilder
, есть два способа получать уведомления об изменениях.Способ 1
Как обсуждалось в комментариях к вопросу, используйте привязку событий к каждому элементу ввода. Добавьте к вашему шаблону:
Тогда в вашем компоненте:
Страница Forms содержит дополнительную информацию о ngModel, которая уместна здесь:
В вашем случае, я полагаю, вы хотите сделать что-то особенное.
Способ 2
Определите локальную переменную шаблона и установите для нее значение
ngForm
.Используйте ngControl для элементов ввода.
Получите ссылку на директиву NgForm формы, используя @ViewChild, затем подпишитесь на ControlGroup NgForm для изменений:
plunker
Для получения дополнительной информации о способе 2 см . Видео Савкина .
Смотрите также ответ @ Thierry's для получения дополнительной информации о том, что вы можете сделать с
valueChanges
наблюдаемым (например, немного отменить / подождать перед обработкой изменений).источник
Чтобы завершить чуть больше предыдущих хороших ответов, вы должны знать, что формы используют наблюдаемые для обнаружения и обработки изменений значений. Это что-то действительно важное и мощное. И Марк, и dfsq описали этот аспект в своих ответах.
Наблюдаемые позволяют не только использовать
subscribe
метод (что-то похожее наthen
метод обещаний в Angular 1). Вы можете пойти дальше, если необходимо реализовать некоторые цепочки обработки обновленных данных в формах.Я имею в виду, вы можете указать на этом уровне время отката с помощью
debounceTime
метода. Это позволяет вам подождать некоторое время перед обработкой изменения и правильно обработать несколько входов:Вы также можете напрямую подключить обработку, которую хотите запустить (например, асинхронную) при обновлении значений. Например, если вы хотите обработать текстовое значение для фильтрации списка на основе запроса AJAX, вы можете использовать
switchMap
метод:Вы даже можете пойти дальше, связав возвращаемую наблюдаемую непосредственно со свойством вашего компонента:
и отобразить его с помощью
async
трубы:Просто чтобы сказать, что вам нужно продумать способ обработки форм в Angular2 по-другому (гораздо более мощный способ ;-)).
Надеюсь, это поможет тебе, Тьерри
источник
Расширяя предложения Марка ...
Способ 3
Реализовать «глубокое» обнаружение изменений на модели. Преимущества в первую очередь включают в себя избежание включения аспектов пользовательского интерфейса в компонент; это также улавливает программные изменения, внесенные в модель. Тем не менее, это потребует дополнительной работы для реализации таких вещей, как устранение неполадок, как предложено Тьерри, и это также поймает ваши собственные программные изменения, поэтому используйте с осторожностью.
Попробуй в Plunker
источник
Для угловой
5+
версии. Помещение версии помогает, так как угловые вносят массу изменений.источник
Я подумал об использовании метода (ngModelChange), затем подумал о методе FormBuilder и, наконец, остановился на вариации метода 3. Это позволяет сэкономить на украшении шаблона дополнительными атрибутами и автоматически подобрать изменения в модели, уменьшив возможность что-то забыть с помощью метода 1 или 2.
Упрощение метода 3 немного ...
Вы можете добавить тайм-аут, чтобы вызывать doSomething () только через x миллисекунд, чтобы имитировать debounce.
источник