2013-03-08 1 views
6

Ho un array osservabile. Voglio eseguire una funzione dopo la cancellazione o l'aggiunta di un elemento da un ObservableArray e dopo il completamento di tutte le sue chiamate di sottoscrizione di dipendenza. Come:Come eseguire la funzione dopo tutte le dipendenze osservableArray eseguite in knockout.js

observableArray.push(newObject); 

//I can't put my function call at this point because if any subscription is.. 
//with newObject or observableArray will execute asynch, and i.. 
//want my function to execute after all such subscription execution. 

C'è un modo per ottenere questo in knockout?

+0

Che tipo di cosa vuoi fare dopo l'aggiornamento? È possibile definire i callback in un binding foreach che viene attivato quando vengono modificati gli elementi dell'array. http://knockoutjs.com/documentation/foreach-binding.html - Vedi nota 7. È questo il genere di cosa che volevi? –

+0

Voglio aggiornare un flag che sto usando anche nelle dipendenze che vengono eseguite dopo le operazioni observableArray (push, pop ..etc), quindi voglio che questo flag si aggiorni solo dopo aver completato tutte le esecuzioni delle dipendenze per l'array osservabile e il nuovo elemento che sta inserendo nell'array. – gaurav

+0

Di quali abbonati dipendenze stai parlando? Non sarebbero già stati licenziati quando hai creato il nuovo oggetto? Puoi creare un jsFiddle per mostrare cosa intendi? –

risposta

1

ho pensato che gli eventi sono stati attivati ​​in modo asincrono, così ho scritto il seguente Live JSFiddle :

var flagUpdater = ko.observable(0), 
    aList = ko.observableArray(["Foo", "Bar", "Baz"]); 

flagUpdater.subscribe(function() { 
    console.log("Change the flag now!"); 
}); 

aList.subscribe(function() { 
    console.log("Schedule flag update"); 
    flagUpdater("blah"); 
}); 

aList.push("Qoo"); 

ma non funziona. Sembra che i callback siano tutti elaborati in modo sincrono, cioè tutte le callback sono già state restituite dopo che è stata restituita la funzione di modifica (ad esempio push()). Così si può semplicemente impostare il flag dopo manipolare l'array (live):

aList.push("Qoo"); 
flag = "CHANGED"; 
console.log("Flag is now " + flag); 
+0

grazie per la risposta, ma puoi per favore elaborare il tuo suggerimento, se contiene un esempio di quello che sarebbe bello – gaurav

+0

@ JCN vedere l'esempio del codice – Raffaele

1

Non sono sicuro se observableArray.push() tornerà vero, ma dare a questo un colpo;

if (observableArray.push(newObject)) { 
    console.log(observableArray); 
}