Ответ 1
Одним из способов достижения этого является использование событий вместо $watch
Смотрите рабочий плукер здесь
В моем плункере я разместил $interval
, который будет имитировать вызов веб-службы, изменяя значение каждые несколько секунд.
Вот что вы можете сделать.
В обработчике then
вашего HTTP-вызова перед установкой нового значения, полученного из веб-службы, в модель, опубликуйте событие с полезной нагрузкой, содержащей старое значение и новое значение, как показано ниже:
$http.get('url goes here')
.then(function (response) {
scope.$broadcast('UPDATE_FROM_SERVER',
{oldValue: scope.elementProperties.left, newValue: response.data.left});
scope.elementProperties.left = response.data.left;
};
Затем в вашем элементе управления формы, где пользователь изменит значение, прикрепите ng-click
, как показано ниже:
ng-change="userChangeHandler(elementProperties.left, '{{elementProperties.left}}')
Обратите внимание на цитаты вокруг '{{elementProperties.left}}'
. Это гарантирует, что функция обработчика изменений получит старое значение свойства.
Теперь вы можете прослушивать эти события изменений, как показано ниже:
$scope.$on('UPDATE_FROM_SERVER', function (event, changes) {
// This code will be invoked when the data is changed by the server
$scope.messages.push('Data changed by Server from ' + changes.oldValue + ' to ' + changes.newValue);
});
$scope.$on('UPDATE_FROM_USER', function (event, changes) {
// This code will be invoked when the data is changed by the user
$scope.messages.push('Data changed by User from ' + changes.oldValue + ' to ' + changes.newValue);
});