2013-07-09 14 views
13

Nel mio codice voglio eseguire la funzione di callback o subito dopo KnockoutJS foreach finiture vincolanti rendendo tutti gli elementiknockoutJS eseguire richiamata dopo foreach termina il rendering

So che posso fare questo semplicemente verificare se si sta all'ultimo elemento (ho trovato che qui execute code after the last item has been rendered).
Ma usando questo la mia funzione di callback sarà chiamata ogni volta che viene eseguito il rendering di un nuovo elemento o record.

Desidero eseguire la funzione di richiamata una sola volta (per prestazioni).

UPDATE

Un'altra soluzione è qui success callback after knockout.js finishes rendering all the elements. ma ancora usando questa mia funzione di callback sarò chiamata ogni volta che viene reso un nuovo elemento.

+1

Sono state prese questa domanda http://stackoverflow.com/questions/14254317/success -callback-dopo-ko-JS-finiture-rendering-tutte-le-elementi? RQ = 1? – nemesv

+0

è lo stesso, usando ** afterRender ** causerà l'esecuzione della funzione di callback ogni elemento è reso –

+0

Se il controllo per essere l'ultimo elemento è la prima cosa nel gestore, non lo farà male. – Tyrsius

risposta

21

Penso che una buona soluzione per questo tipo di problema sia l'utilizzo di un'associazione personalizzata. Sarebbe qualcosa di simile:

ko.bindingHandlers.doSomething = { 
    update: function(element, valueAccessor) { 
     ko.utils.unwrapObservable(valueAccessor()); //grab a dependency to the obs array 

     //do something based on "element" (the container) 
    } 
} 

Si potrebbe usarlo come:

<ul data-bind="foreach: items, doSomething: items"> 
    <li>...</li> 
</ul> 

Le doSomething necessità di afferrare la propria dipendenza items, come foreach aggiornamenti all'interno della propria calcolata osservabile e in KO 3.0 le associazioni saranno indipendenti È anche possibile passare le opzioni a doSomething e quindi ottenere una dipendenza accedendo all'array observable tramite allBindingsAccessor().foreach (il terzo argomento), se si accoppia sempre con foreach.

Ecco un esempio che rende casuale il colore di ogni elemento del observableArray background ogni volta che una volta su ogni modifica al observbaleArray: http://jsfiddle.net/rniemeyer/SCqaS/

+0

scusa non l'ho capito completamente, com'è ** doSomething ** dipende dagli articoli, o qual è il cambiamento che lo rende chiamato? –

+0

In KO, i collegamenti sono implementati all'interno di un osservabile calcolato. Qualsiasi osservabile a cui è stato consentito l'accesso al valore crea dipendenze. In questo caso, chiamando 'ko.utils.unwrapObservable (valueAccessor())' stiamo creando una dipendenza, se il valore passato era un osservabile/osservabileArray. Quindi, ogni volta che questo osservabile viene aggiornato, questo codice verrà eseguito di nuovo. Spero possa aiutare. –

+0

molto bene..un ulteriore dubbio su come ** foreach ** sta per cambiare gli array degli articoli? Penso che sia solo leggere valori degli oggetti! –

Problemi correlati