Модель формы просмотра для изменений

Предполагая данную форму, такую ​​как <form name="myForm">, достаточно просто наблюдать за действительностью, ошибкой, грязным состоянием и т.д., используя простой просмотр:

$scope.$watch('myForm.$valid', function() {
  console.log('form is valid? ', $scope.myForm.$valid); 
});

Однако, похоже, нет простого способа посмотреть, изменился ли какой-либо данный ввод в этой форме. Глубоко смотреть так, не работает:

$scope.$watch('myForm', function() {
  console.log('an input has changed'); //this will never fire
}, true);

$watchCollection идет только на один уровень, что означает, что мне придется создавать новые часы для каждого входа. Не идеально.

Каков элегантный способ просмотра формы изменений на любом входе без необходимости использовать несколько часов или размещение ng-change на каждом входе?

+10
источник поделиться
2 ответа

Что касается возможного дубликата и вашего комментария:

Решение по этому вопросу работает, но это не то, что я имел в виду (т.е. не изящный, так как для его работы требуется размытие).

Он работает, если вы добавите true в качестве третьего параметра для $watch:

$scope.$watch('myFormdata', function() {
    console.log('form model has been changed');
}, true);

Дополнительную информацию см. в docs.

Рабочая скрипта (проверьте журнал консоли)


Еще один способ angular - использовать angular $pristine. Это свойство boolean будет установлено на false после манипулирования моделью формы:

Fiddle

+7
источник

Основываясь на моем опыте работы с моими формами (новый разработчик, но работая с Angular какое-то время), элегантный способ просмотра формы изменений на самом деле не должен вообще использовать какой-либо вид часового оператора. < ш > Используйте встроенный Angular boolean $pristine или $dirty, и эти значения будут автоматически изменяться в любом поле ввода или флажке.
Улов: это не изменит значение, если вы добавите или сплайсируете из массива, который заставил меня замочить на некоторое время.
Лучшим решением для меня было вручную делать $scope.MyForm.$setDirty();, когда я добавлял или удалял из своих разных массивов. Работали как шарм!

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос