2014-04-08 24 views
10

Sono abbastanza nuovo per AngularJS e sto ancora imparando.Direttiva angularJS, avvolgere il contenuto e mantenere gli attributi sull'elemento originale

Ho un po 'di problemi nel creare una direttiva che avvolge l'elemento (ei suoi figli) a cui è applicata la direttiva. Non capisco perché questo scenario apparentemente comune dovrebbe essere così difficile considerando la facilità con cui molte altre cose comuni sono in AngularJS, quindi potrebbe benissimo essere che mi manca qualcosa qui.

Quello che voglio fare è racchiudere un elemento select in un div. Sto usando transclude per preservare l'elemento select originale e il suo contenuto ma non riesco a farlo funzionare correttamente.

Il codice HTML assomiglia a questo:

<select mlb-select ng-options="opt.val as opt.text for opt in mlb" ng-model="mlbOpt"></select> 

... e la mia direttiva si presenta così:

directiveModule.directive("mlbSelect", function(){ 
    return { 
     template: '<div class="mlb-select">' 
        + '<select ng-transclude></select>' 
        + '</div>', 
     transclude: 'element', 
     replace: true 
    } 
}); 

Il codice HTML risultante è simile al seguente:

<div class="mlb-select ng-pristine ng-valid" mlb-select ng-options="opt.val as opt.text for opt in mlb" ng-model="mlbOpt"> 
    <select ng-transclude class="ng-scope"></select> 
</div> 

Naturalmente questo non è quello che voglio Perché le proprietà del mio elemento select sono aggiunte al div wrapping e non all'elemento che ho specificato con l'attributo ng-transclude? L'elemento select deve conservare le opzioni ng-options e ng-model.

Cosa devo fare per eseguire questa operazione?

risposta

1

per quanto ne so l'unico modo per farlo è quello di specificare la direttiva con inclusione in un elemento di involucro, per es .:

<div mlb-select> 
    <select ...></select> 
</div> 

Naturalmente non v'è alcun punto in questo modo se il youe caso è esattamente come sopra.

Transclusion nel contesto di questa domanda più o meno funziona come:

  1. Il contenuto transclusa è il contenuti dell'elemento che ha la direttiva con transclude: true; nel tuo caso il contenuto di <select>, che è vuoto!
  2. Il contenuto escluso viene inserito all'interno dell'elemento che specifica ng-transclude nel modello della direttiva.
+0

Grazie per la rapida risposta! La ragione per cui l'ho voluto in quel modo è che volevo essere in grado di espandere la direttiva con l'aggiunta di fratelli all'elemento select. Sono riuscito a risolvere il mio problema creando la mia direttiva 'create-wrapped-select' che crea l'elemento select nel template. Il problema è che non posso supportare attributi arbitrari sull'elemento select, ma per ora è abbastanza buono. –

+0

Peccato che questo non sia possibile. Sto usando un framework css che definisce la selezione con un pulsante a discesa personalizzato che verrà utilizzato per tutti i menu a discesa selezionati nel mio progetto, ma ho voluto creare una direttiva che ha appena trasformato una selezione standard nella forma avvolta. Ora invece devo racchiudere la select con l'elemento direttivo, che mi fornisce solo una semplificazione dell'html. – awe