182 votes

Comment puis-je ignorer la charge initiale lorsque vous regardez les modifications apportées au modèle dans AngularJS ?

J'ai une page web qui sert de l'éditeur pour une seule entité, qui se trouve comme un graphe dans le $scope.fieldcontainer de la propriété. Après je reçois une réponse de mon API REST (via $ressource), j'ajoute une montre pour 'fieldcontainer'. J'utilise cette montre pour détecter si la page/l'entité est "sale". Droit maintenant, je suis en train de faire le bouton enregistrer de rebond, mais je veux réellement faire le bouton enregistrer invisible jusqu'à ce que l'utilisateur souillures du modèle.

Ce que je reçois est d'un seul déclencheur de la montre, je pense que c'est dû au fait que l' .fieldcontainer = ... cession a lieu immédiatement après que j'ai créer ma montre. Je pensais simplement à l'aide d'un "dirtyCount" propriété d'absorber la première fausse alarme, mais qui se sent très hacky ... et j'ai pensé, il y a un "Angulaire idiomatiques" façon de traiter avec cela - je ne suis pas le seul à l'aide d'une montre pour détecter un sale modèle.

Voici le code où j'ai mis 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 viens de continuer à penser qu'il y a obtenu d'être d'une façon plus propre de faire cela que garde de mon "UI salir" code "si (dirtyCount >0)"...

479voto

MW. Points 2575

La première fois que l'auditeur est appelé, l'ancienne valeur et la nouvelle valeur sera identique. Alors fais ceci:

$scope.$watch('fieldcontainer', function(newValue, oldValue) {
  if (newValue !== oldValue) {
    // do whatever you were going to do
  }
});

C'est en fait la façon dont l'angle de docs vous recommandons de le manipuler:

Après un observateur est enregistré auprès de la portée, de l'auditeur fn est appelée de façon asynchrone (via $evalAsync) pour initialiser l'observateur. Dans de rares cas, ce n'est pas souhaitable parce que l'auditeur est appelé lorsque le résultat de watchExpression n'a pas changé. Pour détecter ce scénario au sein de l'auditeur fn, vous pouvez comparer les newVal et oldVal. Si ces deux valeurs sont identiques (===) ensuite, l'auditeur a été appelé en raison de l'initialisation

115voto

rewritten Points 7430

définir un indicateur juste avant le chargement initial,

et puis quand le premier $watch se déclenche, faire

Le drapeau sera déchirure vers le bas juste à la fin du cycle actuel digest, donc changement prochain ne sera pas bloqué.

42voto

trixtur Points 50

Je sais que cette question a été répondue, mais j’ai une suggestion :

À l’aide de drapeaux fonctionne mais il a un peu une odeur de code il vous ne pensez pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X