web-dev-qa-db-fra.com

Angular JS $ watch vs $ on

Je veux exécuter une fonction à l'intérieur d'une directive, chaque fois qu'il y a un changement d'état dans la portée parent.

La manière évidente d'y parvenir est d'utiliser les diffusions d'événements ( $ broadcast ) et les écouteurs ( $ on ).

Je suis curieux de savoir si l'utilisation d'une montre $ est une alternative à la diffusion d'événements. Si tel est le cas, comment les deux se comparent-ils?

Pour autant que je sache, l'expression à surveiller est évaluée à chaque cycle de $ digest. Les événements sont-ils donc plus efficaces que regarder?

34
Yogesh Mangaj

La fonction $watch Est utilisée pour surveiller les variables sur la portée. L'héritage de portée vous permet également de surveiller les variables de portée parent, c'est donc certainement la voie à suivre pour votre cas d'utilisation. Comme vous l'avez dit correctement, $on Est utilisé pour surveiller les événements, que vous pouvez $broadcast Pour les étendues enfant ou $emit Pour les étendues parent. Cela vous donne beaucoup plus de contrôle, mais cela peut provoquer plus d'erreurs lors du codage, car vous pouvez obtenir une mise à jour d'une variable de portée à partir d'un point que vous ne surveillez pas et oublier d'avertir les écouteurs.

Vous pouvez toujours utiliser des événements lorsque vous n'héritez pas des variables de portée. Mais attention à ne pas polluer une large étendue, l'utilisation de services peut être une option, car vous voyez immédiatement si elle est injectée ou non.

Puisqu'une directive obtient la portée sur laquelle elle se trouve (ou en hérite), je dirais que $watch Est une option beaucoup plus propre ici.

Si vous voulez avoir une portée isolée sur votre directive, vous pouvez passer des arguments en tant qu'attributs et $observe Eux.

32