Как определить факт изменения модели или скоупа angular.js?
Есть ли в angular встроенный механизм, который позволяет судить о том, что модель или $scope изменены, но не сохранены? Может плагин какой-нибудь.. Или хотя бы подскажите ключевые слова, по которым искать, т.к. я ничего не нагуглил.
Я хочу в случае изменения модели подкрасить элемент dom типа "изменения не сохранены"
При этом я не хотел бы делать сохранение на сервер при каждом изменении модели, чтобы избежать пусть и мизерного, но лишнего трафика.
Не хотелось бы подписываться на событие типа "onChange", если конечно такое есть. Хочу заюзать свойство с автобиндингом, чтобы просто к нему подцепиться и все.
Встроенных средств нет.
Правильнее написать директиву, которая будет слушать изменения в модели. При сохранении вы к примеру генерите событие, при котором эта директива сохраняет текущее значение модели. При несовпадении модели и ее последнего сохраненного значения директива выставляет на элементе определенный класс.
э не, это вам надо свой ватчер использовать... у формы есть $pristine/$dirty но оно поможет вам только один раз. Затем придется перезагружать для того что бы директива успешно переинициализировалась. Слишком кастомная задача.
Не совсем понял, почему "слишком кастомная". Например в backbone у модели есть поле isChanged (ну или как-то так, но там модель это свой класс со встроенным бекбоносипедом. В ангуляре же обзервер следит за изменениями. По идее у него должно быть поле, в которое можно посмотреть и понять, наобзервил он что-то новое или нет? Я не очень мутно сформулировал?
Александр: бэкбону это нужно что бы знать нужно синкать данные с серваком или нет. Вы можете так же реализовать свою модель с геттерами/сеттерами или вообще бэкбон подключить в довесок. А "обзерверы" ангуляра детектят только локальные изменения и следят только за тем за чем его просили следить.
Согласен с Dmitry Dedukhin. Проще всего оформить это в виде директивы, которая будет хранить текущую модель, которая связана с полями для ввода, и последнюю сохранённую модель, с которой при каждом изменении текущей модели (что отлавливается с помощью $watch-ера) будет сравниваться. На этапе инициализации директивы нужно их проинициализировать одинаковым значением. При этом не забудьте, что если у вас значения не скалярные, то нужно делать angular.copy(), а то у вас будут ссылки на один и тот же объект и оно всегда будет равно друг другу.
Через контроллер можно получить доступ и добавить слушателей на изменение модели $viewChangeListeners. Слушатель будет простой, без аргументов, просто сигнал что визуальное представление изменилось.
Подробнее здесь - https://docs.angularjs.org/api/ng/type/ngModel.NgM...