10
votes

La directive angulaire n'évalue pas à l'intérieur de la répétition NG

J'ai la configuration suivante:

application / directive p> xxx pré>

contrôleur p> xxx pré>

html: P>

<div ng-app="MyApp">
    <div ng-controller="PositionsController">            
        <table>
            <tr ng-repeat="position in positions">
                <admin-roster-item displayText="{{ position.Name + ' (' + position.Code + ')' }}"></admin-roster-item>
             </tr>
         </table>       
    </div>
</div>


1 commentaires

Il y a un problème dans le suivi de l'Angularjs à ce sujet: Github.com/angular/angular.js/ Problèmes / 1459


6 Réponses :


2
votes

Je pense que la bonne façon d'aborder cela serait d'envoyer l'objet dans l'élément de la liste d'administration, comme celui-ci: xxx

et dans la directive: xxx < / Pré>

PS. Je n'ai pas testé cela!


0 commentaires

8
votes

convient que vous devez penser à l'endroit où la directive commence et se termine. Voici un PLNKR qui illustre une directive liée à chaque élément de la matrice - http://plnkr.co/ Edit / IU8FANREYP7NYRS4SWTW? P = Aperçu

Si vous souhaitez que la directive encapsule l'énumération d'une collection définie par une portée parentale, elle obtient un peu plus de travail. Je ne sais pas si ce qui suit est "la meilleure pratique", mais c'est comme ça que j'ai manipulé - http://plnkr.co/edit/iu8fanreyp7nyrs4swtw?p=preview

Lorsque vous comptez sur la directive pour effectuer l'itération, vous vous impliquez avec la transclusion, ce qui est un mot composé qui signifie (comme je le comprends), prenez le contenu défini dans le parent, poussez-le dans la directive, puis en l'évaluez. J'ai travaillé avec angular pendant quelques mois et je commence à penser que demander à la directive de itération est une odeur et j'ai toujours pu concevoir autour de lui.


4 commentaires

Je ne sais pas ce que tu veux dire par "Pensez à l'endroit où la directive commence et se termine." J'ai regardé le code Plnkr et j'ai reçu le motif. L'utilisation de l'isolat "=" semble fonctionner pour celui-ci. J'ai également supprimé la table, TR et TD et les divs utilisés à la place. Cela n'a pas fonctionné avec la structure de la table mais cela a fait avec les DIV.


Je veux dire qu'il est important de penser à la directive en termes de quelle valeur est-il à la vue qui l'utilise. Je trouve que les directives sont les plus faciles à gérer s'ils sont de petits morceaux de comportement usi + encapsulés. Si je perds le site de la fonctionnalité de base que la directive est censée fournir (et commencer cela commence à prendre trop de responsabilités) la complexité commence à submerger.


"Transclusion" n'est pas un mot maquillé: en.wikipedia.org/wiki/transclusclusclusion : )


Je suis confronté au même problème, ma directive fonctionne bien avec des divs mais ne rend pas dès que j'utilise une structure de table. Je ne considère pas cette réponse comme une solution. Je veux une table.



9
votes

Ignorer tous les aspects théoriques, vous pouvez faire fonctionner votre code en effectuant deux modifications simples.

  1. N'utilisez pas de cas mixte dans vos noms d'attribut. displaytext pas displaytext
  2. mettre les balises en dehors de la directive, dans le modèle

    Faites cela et cela fonctionnera; Il pense que ce sont tous deux des bugs angulaires.


2 commentaires

Choquant! Cela fonctionne même lorsque je n'ai pas appliqué les autres conseils ci-dessus (cependant, ils sont toujours bons à savoir). La manutention de la table semble être "peu coopérative", mais a essayé de faire le modèle racine un TR et de mettre NG-répéter sur la table - n'a pas fonctionné. Tout a tout changé pour diviser et s'étendre, et cela fonctionne, bien que la mise en page a l'air foiré.


Sugestion 2 résout. Suggestion 1 est inutile (utilisez Camelcase dans JavaScript, balises hyphenées sur HTML).



0
votes

J'ai eu le problème similaire, où la répétition NG à mon avis n'a pas été évaluée si la visualisation contenue la directive («mydirective»)

ma définition de directive était xxx < P> Et ma définition du contrôleur d'affichage était xxx

Vous pouvez remarquer que les deux contrôleurs sont référencés par "VM" en utilisant le paramètre "Controlleras". C'est la raison du problème. Lorsque la directive est présente dans la vue, Angular désigne toujours le «VM» défini dans le contrôleur de directive plutôt que sur la vue.

Lorsque je donne des noms différents pour les références de contrôleur, le problème a disparu

maintenant , Ma définition de directive est xxx

et ma définition de contrôleur de vue était xxx

espère que cela aide. < / p>


0 commentaires

1
votes

Au lieu d'écrire votre directive en tant qu'enfant de la répétition NG, essayez de garder la directive personnalisée au même niveau que NG-REPEAT, ce xxx

et en outre, permettez à votre directive personnalisée de être utilisé comme attribut. Angulajs a défini la priorité des répétitions NG en 1000, donc parfois lorsque la directive personnalisée est faite, elle ne diminue pas bien avec NG-REPEAT.

Une deuxième option (essayez uniquement si le premier échoue) est de définir la priorité de votre directive personnalisée plus que celle de NGRepeat, c'est-à-dire à 1001.


0 commentaires

0
votes

avait exactement le même problème. Il y avait une directive personnalisée dans une directive NG-REPEAT, TABLE-> TR-> TD-> et lors du tri de la table à l'aide de NG-REPEAT et de TRAY.Sort. Le tableau a changé de commande, mais les directives n'ont pas rendu. Le problème était que j'utilisais

track by $index


0 commentaires