Как определить факт изменения модели или скоупа angular.js?

Есть ли в angular встроенный механизм, который позволяет судить о том, что модель или $scope изменены, но не сохранены? Может плагин какой-нибудь.. Или хотя бы подскажите ключевые слова, по которым искать, т.к. я ничего не нагуглил.

Я хочу в случае изменения модели подкрасить элемент dom типа "изменения не сохранены"
При этом я не хотел бы делать сохранение на сервер при каждом изменении модели, чтобы избежать пусть и мизерного, но лишнего трафика.
Не хотелось бы подписываться на событие типа "onChange", если конечно такое есть. Хочу заюзать свойство с автобиндингом, чтобы просто к нему подцепиться и все.
  • Вопрос задан
  • 3243 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Demetros
Встроенных средств нет.
Правильнее написать директиву, которая будет слушать изменения в модели. При сохранении вы к примеру генерите событие, при котором эта директива сохраняет текущее значение модели. При несовпадении модели и ее последнего сохраненного значения директива выставляет на элементе определенный класс.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
э не, это вам надо свой ватчер использовать... у формы есть $pristine/$dirty но оно поможет вам только один раз. Затем придется перезагружать для того что бы директива успешно переинициализировалась. Слишком кастомная задача.
Ответ написан
alexiusp
@alexiusp
senior frontend developer
Согласен с Dmitry Dedukhin. Проще всего оформить это в виде директивы, которая будет хранить текущую модель, которая связана с полями для ввода, и последнюю сохранённую модель, с которой при каждом изменении текущей модели (что отлавливается с помощью $watch-ера) будет сравниваться. На этапе инициализации директивы нужно их проинициализировать одинаковым значением. При этом не забудьте, что если у вас значения не скалярные, то нужно делать angular.copy(), а то у вас будут ссылки на один и тот же объект и оно всегда будет равно друг другу.
Ответ написан
Комментировать
DigitalSmile
@DigitalSmile
http://brainstorage.me/digitalsmile
Немного дополню ответ Dmitry Dedukhin. В директиву нужно вписать
...
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
   // ctrl - контроллер ngModel
}
...

Через контроллер можно получить доступ и добавить слушателей на изменение модели $viewChangeListeners. Слушатель будет простой, без аргументов, просто сигнал что визуальное представление изменилось.
Подробнее здесь - https://docs.angularjs.org/api/ng/type/ngModel.NgM...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы