J'ai une page Web qui sert d'éditeur pour une seule entité, qui se présente comme un graphe profond dans la propriété $ scope.fieldcontainer. Après avoir reçu une réponse de mon API REST (via $ resource), j'ajoute une montre à 'fieldcontainer'. J'utilise cette montre pour détecter si la page / entité est "sale". En ce moment, je fais rebondir le bouton de sauvegarde, mais je veux vraiment rendre le bouton de sauvegarde invisible jusqu'à ce que l'utilisateur salisse le modèle.
Ce que je reçois, c'est un seul déclencheur de la montre, ce qui, je pense, se produit parce que l'affectation .fieldcontainer = ... a lieu immédiatement après la création de ma montre. Je pensais simplement utiliser une propriété "dirtyCount" pour absorber la fausse alarme initiale, mais cela semble très piraté ... et j'ai pensé qu'il devait y avoir un moyen "angular idiomatic" de gérer cela - je ne suis pas le seul à l'aide d'une montre pour détecter un modèle sale.
Voici le code où je règle ma montre:
$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);
});
Je n'arrête pas de penser qu'il doit y avoir un moyen plus propre de le faire que de protéger mon code "UI salissant" avec un "if (dirtyCount> 0)" ...
la source
undefined
. Il a une valeur par défaut qui est nécessaire dans le cas où la mise à jour de mon modèle ne contient pas toutes les informations. Ainsi, certaines valeurs ne changent pas mais doivent se déclencher.Réponses:
définir un drapeau juste avant le chargement initial,
puis quand la première $ watch se déclenche, faites
L'indicateur sera supprimé juste à la fin du cycle de résumé en cours, donc le prochain changement ne sera pas bloqué.
la source
La première fois que l'écouteur est appelé, l'ancienne valeur et la nouvelle valeur seront identiques. Alors fais juste ceci:
C'est en fait la façon dont les documents Angular recommandent de le gérer :
la source
null
à la valeur initiale chargée, de ne pas ignorer le changement lorsqu'il n'y a pas de changement.null
.oldValue
sera nul lors de la première remise des gaz.Je me rends compte que cette question a été répondue, mais j'ai une suggestion:
L'utilisation de drapeaux fonctionne mais a une petite odeur de code, vous ne pensez pas?
la source
return unless oldValue?
(? Est l'opérateur existentiel dans CS).Lors du chargement initial des valeurs actuelles, l'ancien champ de valeur n'est pas défini. L'exemple ci-dessous vous aide donc à exclure les chargements initiaux.
la source
null
etundefined
correspondra dans cette situation, ou ('1' == 1
etc)Validez simplement l'état du nouveau val:
la source