У меня есть веб-страница, которая служит редактором для одной сущности, которая находится в виде глубокого графика в свойстве $ scope.fieldcontainer. Получив ответ от моего REST API (через $ resource), я добавляю часы в 'fieldcontainer'. Я использую эти часы, чтобы определить, является ли страница / сущность «грязной». Прямо сейчас я отскакиваю кнопку сохранения, но на самом деле я хочу сделать кнопку сохранения невидимой, пока пользователь не загрязнит модель.
То, что я получаю, - это один триггер часов, который, я думаю, происходит, потому что назначение .fieldcontainer = ... происходит сразу после того, как я создаю свои часы. Я думал о том, чтобы просто использовать свойство dirtyCount, чтобы поглотить первоначальную ложную тревогу, но это выглядит очень странно ... и я подумал, что должен быть "угловой идиоматический" способ справиться с этим - я не единственный используя часы, чтобы обнаружить грязную модель.
Вот код, где я установил свои часы:
$scope.fieldcontainer = Message.get({id: $scope.entityId },
function(message,headers) {
$scope.$watch('fieldcontainer',
function() {
console.log("model is dirty.");
if ($scope.visibility.saveButton) {
$('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
}
}, true);
});
Я просто продолжаю думать, что должен быть более чистый способ сделать это, чем защита моего кода "UI dirtying" с помощью "if (dirtyCount> 0)" ...
источник
undefined
. У него есть значение по умолчанию, которое необходимо в случае, если в моей модели обновления не придумали всю информацию. Поэтому некоторые значения не меняются, но должны срабатывать.Ответы:
установить флаг непосредственно перед начальной загрузкой,
и затем, когда первый $ watch сработает, сделайте
Флаг будет снят только в конце текущего цикла дайджеста, поэтому следующее изменение не будет заблокировано.
источник
При первом вызове слушателя старое значение и новое значение будут идентичны. Так что просто сделайте это:
На самом деле, именно так Angular docs рекомендует обращаться с этим :
источник
null
чтобы игнорировать изменение от начального загруженного значения, а не игнорировать изменение, когда изменений нет.null
.oldValue
будет нулевым на первом уходе.Я понимаю, что на этот вопрос был дан ответ, однако у меня есть предложение:
Использование флагов работает, но имеет некоторый запах кода, не правда ли?
источник
return unless oldValue?
(? - экзистенциальный оператор в CS).При первоначальной загрузке текущих значений поле старого значения не определено. Таким образом, приведенный ниже пример поможет вам исключить начальные загрузки.
источник
null
иundefined
будет соответствовать в этой ситуации, или (и'1' == 1
т. Д.)Просто действительное состояние нового val:
источник