2013-09-06 14 views
5

Desidero scegliere quale direttiva utilizzare in base a una variabile. Nello specifico, ho elementi di diversi tipi in una lista, quindi mi piacerebbe usare il tipo di oggetto per scegliere la direttiva che può visualizzarlo.Scelta condizionale della direttiva

ng-switch sembra destinato a questo scopo. Tuttavia, aggiunge tutte le opzioni dell'interruttore nel DOM, quindi nasconde tutte tranne una. Questo approccio sembra inefficiente se ci sono molti tipi di articoli o una lunga lista da visualizzare. Inoltre, l'utilizzo di un interruttore inserisce la logica nell'HTML. Preferito sarebbe un 'modello di strategia' che basta scegliere la direttiva destra, forse come

<display-{{item.type}} data="item.data" /> 

in cui le direttive sono 'displayType1', 'displayType2', e così via. Tuttavia, questa sintassi sembra non funzionare, forse a causa della differenza tra le fasi di compilazione e di collegamento. Here è un esempio che cambia i template html all'interno di una direttiva. Ma c'è un modo per cambiare le direttive, mantenendo la loro modularità?

+0

Dai un'occhiata a questo. Ci ho provato un po 'di tempo fa. Fondamentalmente si crea un modello da ogni direttiva. http://stackoverflow.com/questions/14643601/angularjs-how-to-have-a-directive-with-a-dynamic-sub-directive/14648641#14648641 – Chandermani

+0

Chandermani, la tua soluzione ha funzionato per me. Grazie! Se la promuoverai a una risposta, la contrassegnerò come accettata. – CodeGuy2001

risposta

5

Aggiungendo la soluzione basata su @ CodeGuy2001 consigli .

L'approccio da seguire è creare un modello angolare per ciascuna variazione della direttiva con un nome di modello diverso.

Quindi utilizzare ng-include per selezionare il modello che deve essere utilizzato. Poiché ng-include supporta il collegamento dati alla proprietà src. È possibile cambiare il modello e quindi le direttive in modo dinamico.

Vedere il violino in azione http://jsfiddle.net/xpKwb/2/

+0

Sembra che ci dovrebbe essere una soluzione più diretta, ma questo metodo funziona. – CodeGuy2001

1

Non sono a conoscenza di un modo per aggiungere un nome di direttiva dinamico come quello. Un paio di idee alternative:

1) Basta usare una singola direttiva con item.type come parametro e fare in modo che la direttiva agisca diversamente in base al valore.

2) Invece di ng-switch, uso ng-se che rimuove effettivamente l'elemento dal DOM piuttosto che nasconderlo (come ng-nascondere o ng-switch)

Problemi correlati