AngularJS directive besoin de regarder deux propriétés
Je suis en train de faire un jeu Angulaire. Chaque joueur de l'objet a une x
et un y
de la propriété. Chaque fois que le joueur se déplace, je veux démarrer une minuterie qui parcourt un couple d'arrière-plan des postes dans la feuille sprite.
Je pensais le faire avec une directive. Le problème est que les directives normalement vous permettent de définir une expression à regarder:
//"test" directive
module.directive("test", function() {
return function(scope, element, attrs) {
scope.$watch(attrs.test, function(value) {
//do something when it changes
})
}
})
//my template
<div test="name"/>
La bonne chose à propos de cette approche, est la test
la directive n'a pas à assumer la portée a une propriété en particulier. Vous avez dit ce qu'il a à utiliser lorsque vous utilisez la directive.
Le problème est que dans mon cas, j'ai besoin de coup de pied quelque chose si x OU y change. Comment puis-je faire cela?
<div test="player.x, player.y"/>
<div test="player.x" test-two="player.y"/>
Est-il un meilleur moyen de faire ce que vous pouvez penser? Fondamentalement, je veux faire une directive qui fait quelque chose sur une minuterie si l'un de plusieurs propriétés de changement.
OriginalL'auteur Sean Clark Hess | 2012-11-11
Vous devez vous connecter pour publier un commentaire.
La méthode la plus simple et la plus lisible solution à mon avis est d'utiliser deux attributs et simplement mis en place deux montres:
Comment voyez-vous l'utilisateur doit spécifier les attributs à regarder?
Je suppose que c'est ce que je demande. Comment voulez-vous faire ce que vous recommandez, sans forcer, de ne travailler qu'avec x et y. Avec tous les deux propriétés? ou une propriété, si l'utilisateur souhaite à la place? Voir mon commentaire sur eventOn de réponse.
il y a maintenant
watchGroup
vous pouvez squash les montresscope.$watch([attrs.test, attrs.testTwo], doStuff);
OriginalL'auteur Pete BD
Je voudrais essayer d'utiliser une fonction dans l' $la fonction veille.
Ici est la plunker
ensuite, vous pouvez suivre l'emplacement de l'objet.
Je ne pense pas que c'est plus clair, plus rapidement.
C'est le moyen d'utiliser une montre pour surveiller plus de 1 variable. Je n'ai pas dit que c'est plus rapide. Cependant, je pense qu'il ne vous sauver d'une montre. Vous pouvez acquérir une certaine avantages. BTW, c'est comment les créateurs de AngularJS faire, j'ai vu un des membres principaux d'utiliser ce moyen quelque part.
SI vous allez faire cela, alors pourquoi s'embêter à stocker la variable... portée.$regarder(function (){ return { x: attrs.x, y: attrs.y}; }, ..., true); en dehors de cela, vous êtes maintenant en s'appuyant sur la profondeur de l'égalité. Je voudrais encore aller avec deux montres qui appellent la même fonction sur un changement.
OriginalL'auteur maxisam
Il existe quelques solutions pour ce
De regarder plusieurs $portée des attributs
https://groups.google.com/forum/?fromgroups=#!topic/angulaire/yInmKjlrjzI
<div test="{{player.x}} {{player.y}}"/>
? Le problème est que vous devez sauter par-dessus et l'utilisationattrs.$observe
au lieu descope.$watch
. Ça fait bizarre d'avoir à changer de la fonction que j'utilise en fonction de comment il est utiliséOriginalL'auteur Everton Yoshitani
voir ce lien
vous pouvez également utiliser $watchGroup - voir ce lien
OriginalL'auteur Omid-RH