2015-05-06 4 views
10

Допуская данную форму, такие как <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 на каждом входе?

+3

Возможный дубликат [AngularJS 1.3 - \ 'ng-change \' -like функциональность для всей формы] (http://stackoverflow.com/questions/28677638/angularjs-1-3-ng-change-like- функциональность для всей формы) – DTing

+0

Решение по этому вопросу работает, но это не то, что я имел в виду (то есть не изящный, так как для его работы требуется размытие). В идеале я бы хотел, чтобы это работало аналогично тому, как угловой внутри задает форму $ valid или $ error сразу после того, как дочерний вход изменится соответствующим образом. – Duncan

ответ

7

Что касается possible duplicate и Ваш комментарий:

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

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

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

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

Working Fiddle (проверка журнал консоль)


Другого более угловатым способ бы использовать угловые-х $pristine. Это логическое свойство будет установлено на false разы вы манипулируете вид модель:

Fiddle

+0

Действительно, я знаю, что он работает таким образом, когда ваши поля формы имеют общий родительский объект. И я могу использовать часы таким образом - я идеально надеялся, что будет способ смотреть, используя имя формы, а не модель. Каждый вход привязан к – Duncan

+0

. Это зависит от того, нужно ли новое значение.Если вы просто хотите, чтобы что-то изменилось, вы можете использовать '$ первозданный'. – DonJuwe

+0

Это в контексте автосохранения, поэтому, если '' '$ pristine'' или' '' $ dirty''' были бы полезны для первого изменения, они не будут полезны для каждого последующего изменения, если только я не буду вручную устанавливать первозданное/грязное значение при каждом сохранении, которое кажется мне немного взломанным. Мне, вероятно, придется довольствоваться глубокими наблюдениями за моделью, которую разделяют ресурсы. – Duncan

3

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

Смежные вопросы