Eu tenho uma página da web que serve como editor de uma única entidade, que fica como um gráfico profundo na propriedade $ scope.fieldcontainer. Depois de receber uma resposta da minha API REST (via $ resource), adiciono um relógio ao 'fieldcontainer'. Estou usando este relógio para detectar se a página / entidade está "suja". No momento, estou fazendo o botão salvar saltar, mas realmente quero tornar o botão invisível até que o usuário direcione o modelo.
O que estou obtendo é um único gatilho do relógio, o que acho que está acontecendo porque a atribuição .fieldcontainer = ... ocorre imediatamente após a criação do relógio. Eu estava pensando em usar apenas uma propriedade "dirtyCount" para absorver o alarme falso inicial, mas isso parece muito hacky ... e achei que deveria haver uma maneira "angular idiomática" de lidar com isso - eu não sou o único usando um relógio para detectar um modelo sujo.
Aqui está o código em que eu ajusto meu relógio:
$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);
});
Eu continuo pensando que deve haver uma maneira mais limpa de fazer isso do que guardar meu código "UI dirtying" com um "if (dirtyCount> 0)" ...
fonte
undefined
. Ele tem um valor padrão, necessário no caso de minha atualização de modelo, não apresentar todas as informações. Portanto, alguns valores não mudam, mas precisam ser acionados.Respostas:
defina um sinalizador imediatamente antes do carregamento inicial,
e quando o primeiro $ watch for disparado, faça
A sinalização será removida no final do ciclo de resumo atual, para que a próxima alteração não seja bloqueada.
fonte
Na primeira vez que o ouvinte é chamado, o valor antigo e o novo valor serão idênticos. Então, faça o seguinte:
Essa é realmente a maneira que os documentos do Angular recomendam :
fonte
null
para o valor inicial carregado, para não ignorar a alteração quando não houver alteração.null
.oldValue
será nulo na primeira volta.Sei que esta pergunta foi respondida, no entanto, tenho uma sugestão:
O uso de flags funciona, mas tem um pouco de cheiro de código , você não acha?
fonte
return unless oldValue?
(? É o operador existencial no CS).Durante o carregamento inicial dos valores atuais, o campo de valor antigo é indefinido. Portanto, o exemplo abaixo ajuda você a excluir carregamentos iniciais.
fonte
null
eundefined
corresponderá a essa situação, ou ('1' == 1
etc) #Apenas valide o estado do novo valor:
fonte