Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée de la solution au problème d'invalidation de $watch dans angulaireJS

黄舟
Libérer: 2017-08-13 10:52:22
original
1628 Les gens l'ont consulté

Cet article présente principalement la solution au problème d'échec de $watch d'angularJS. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer.

Cet article présente la solution au problème d'échec de $watch d'angularJS. Partagez-le avec tout le monde et laissez-vous une note en passant.

La méthode $watch peut nous aider dans chaque domaine. . Surveillez les variables qu'il contient.

$watch Variable unique

Pour les variables ordinaires, telles que les nombres, les chaînes, etc., vous pouvez surveiller les modifications des variables en écrivant directement comme suit et en exécutant le correspondant de la fonction.


$scope.count=1;
$scope.$watch('count',function(){
...
});
Copier après la connexion

$watch multiple variables

Pour surveiller les changements dans plusieurs variables, si vous exécutez la même fonction, vous pouvez Ces variables sont converties en chaînes et séparées par des signes '+' pour la surveillance


//当count或page变化时,都会执行这个匿名函数
$scope.count=1;
$scope.page=1;
$scope.$watch('count + page',function(){
...
});
Copier après la connexion

$watch objet ou tableau

J'ai découvert qu'en utilisant les deux méthodes ci-dessus pour surveiller le tableau, j'ai constaté que même si le contenu du tableau changeait, la fonction anonyme n'était pas déclenchée. Plus tard, j'ai découvert que la fonction watch a en fait trois variables. Le premier paramètre est l'objet qui doit être surveillé. Le deuxième paramètre est la fonction qui doit être appelée lorsque l'objet surveillé change. , ce qui est par défaut le cas false.

Lorsque le troisième paramètre est faux, la fonction de surveillance surveille en fait l'adresse du tableau, et les modifications dans le contenu du tableau n'affecteront pas les modifications de l'adresse du tableau, donc la fonction de surveillance échoue.

La solution est d'ajouter le troisième paramètre comme vrai plus tard (bien sûr, vous pouvez également utiliser cette fonction d'écoute pour renvoyer le résultat sous forme de fonction anonyme de l'objet ou du tableau sous forme de JSON string.)


$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch('items',function(){...},true);
Copier après la connexion

Ou écoutez une fonction anonyme qui renvoie l'objet ou le tableau sous la forme d'une chaîne JSON


$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch(function(){
  return JSON.stringify($scope.items);
},function(){...});
Copier après la connexion

$regardez le résultat renvoyé par la fonction

Lors de l'écriture de code, vous devez parfois surveiller si le résultat renvoyé par une fonction change, j'ai donc vérifié $ la montre surveille la fonction.

Méthode 1 : L'objet de surveillance est la chaîne "nom de la fonction ()", pensez à ajouter "()" !


//未完成的任务个数
$scope.unDoneCount = function() {
  var count = 0;
  angular.forEach($scope.todoList, function(todo) {
    count += todo.done ? 0 : 1;
  });
  return count;
};
//单选影响全选部分
$scope.$watch('unDoneCount()', function(nv) {
  $scope.isDoneAll = nv ? false : true;
});
Copier après la connexion

Méthode 2 : Définissez-la comme fonction anonyme dans l'objet de surveillance et renvoyez la valeur de retour de la fonction à surveiller (sale...)


$scope.$watch(function(){
  return $scope.unDoneCount();//不要忘了(),要执行的啊~
}, function(nv) {
  $scope.isDoneAll = nv ? false : true;
});
Copier après la connexion

Annuler $watch

La consommation de performances de la montre semble être assez importante, donc pour les montres qui n'ont plus besoin d'être surveillées, pensez à les annuler régulièrement.

Quant à comment annuler... Je l'ai trouvé après une longue recherche

En fait, le résultat renvoyé par chaque fonction de montre est le deregisterWatch() fonction de cette montre


//在chrome的控制台上,断点得到的$watch的返回值
function deregisterWatch() {
  arrayRemove(array, watcher);
  lastDirtyWatch = null;
}
Copier après la connexion

Donc, si vous souhaitez annuler la montre, enregistrez simplement la valeur de retour de $watch au début lorsque vous souhaitez annuler la montre. regarde, appelle-le.


var count=1;
var unbingWatch=$scope.$watch('todoList',function(){
  console.log('todoList change');
  count++;
  //相当于在todoList变化了4次之后,就调用unbingWatch()取消这个watch
  //在第5次todoList改变的时候,就不会输出todoList change了。
  if(count>4){
    unbingWatch();
  }
});
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!