Все верно, на самом деле.
ng-dirty появляется тогда, когда пользователь поработал с формой.
До этого будет ng-pristine.
Но сама валидация (ng-invalid-required, например), обновляется и после программного изменения модели.
Так что вам, скорей всего, нужно чуть-чуть изменить логику в своем контроллере. Я сделал так, что у меня есть переменная, которая отвечает за то, показывать ошибки или нет.
Логика такая:
- пользователь редактирует новую форму, мы ему ничего не показываем (зачем его отвлекать ?)
- по нажатию на "Сохранить", "Вперед" и т. д. проверяем, если форма не валидна, мы включаем отображение ошибок, и ждем пока он все ошибки не исправит, а доступность кнопки определяем по form.$dirty