2013-03-12 5 views
5

Sto cercando di implementare il plug-in multiselect jQuery utilizzando una direttiva all'interno della mia app. Qui' l'elemento di selezione:Come posso determinare quando ng-options ha terminato l'aggiornamento del DOM?

<select multiple 
     ng-model="data.partyIds" 
     ng-options="party.id as party.name for party in parties" 
     xs-multiselect="parties"> 
</select> 

Il modello parties modello viene caricato tramite $ http. Il plug-in multiselect analizza gli elementi option all'interno di select e genera la bella selezione multipla.

C'è un modo per rilevare quando l'elemento select è popolato con opzioni, quindi posso dire al plug-in multiselect di aggiornare i suoi dati?

Ecco la mia direttiva:

machineXs.directive("xsMultiselect", function() { 
    return { 
     restrict: "A", 
     require: '?ngModel', 
     link: function(scope, element, attrs, ngModel) { 
      element.multiselect().multiselectfilter(); 
      scope.$watch(scope[attrs["xsMultiselect"]], function() { 
       // I tried watching but it doesn't help 
       element.multiselect('refresh'); 
       element.multiselectfilter("updateCache"); 
      }); 
     } 
    } 
}); 
+0

Dentro il tuo $ orologio, provare a chiamare timeout $ - vale a dire, mettere la roba selezione multipla all'interno di una funzione di callback di timeout. Ciò potrebbe dare alla direttiva ng-options la possibilità di eseguire e aggiungere le opzioni al DOM. –

+0

Non funziona. Ho impostato correttamente l'orologio $? – lucassp

+0

Mi sembra a posto. Non ero sicuro se il mio suggerimento avrebbe funzionato. Angular non ha davvero alcun modo di segnalare quando il rendering è completo. A volte $ timeout funziona, ma non sempre. –

risposta

5

Come discusso nei commenti, uso

scope.$watch(attrs.xsMultiselect, ...) 

Non sono sicuro di quando l'orologio si innesca quando vs ngOptions aggiorna il DOM. Se scopri che l'orologio si sta attivando troppo presto, puoi provare a utilizzare $evalAsync() o $ timeout(). $ evalAsync verrà eseguito in seguito, ma prima del rendering del DOM. $ timeout() verrà eseguito in seguito, dopo il rendering del DOM.

scope.$watch(attrs.xsMultiselect, function() { 
    scope.$evalAsync(function() { 
     element.multiselect('refresh'); 
     element.multiselectfilter("updateCache"); 
    }); 
}); 

o, dopo il DOM rende:

scope.$watch(attrs.xsMultiselect, function() { 
    $timeout(function() { 
     element.multiselect('refresh'); 
     element.multiselectfilter("updateCache"); 
    }); 
}); 
+0

Questo non funziona in Angular 1.5.6, si attiva prima che il DOM venga aggiornato. Qualche idea?! – Campbeln