2011-11-02 1 views
7

Come aggiungere tutti i valori a observableArray in una volta? L'aggiunta di valori in loop funziona molto lentamente nel mio caso. Ecco l'esempio di jsfiddle. jsfiddlead eliminazione diretta osservabile Prestazioni dell'array

+0

ho una nota sugli elementi Aggiunta a un problema di prestazioni matrice che si dovrebbe usare nome_array [array_name.length-1] = il vostro articolo; questa linea è più veloce del metodo push – Marwan

+0

La differenza è davvero grande? – Neir0

+0

penso di sì vedere questo articolo http://www.scottlogic.co.uk/2010/10/javascript-array-performance/ e mi dispiace averlo sbagliato nome_array [nome_array.length] = il tuo articolo – Marwan

risposta

7

Dal momento che stai sgombrare l'intero array osservabile, un modo è possibile raggiungere questo obiettivo è:

var viewModel = { 
    name: "base", 
    addingValue:new ko.observable(), 
    someArr: new ko.observableArray(["123","432","sdafasd","xrere"]), 
    add: function() 
    { 
     this.someArr.push(this.addingValue()); 
    }, 
    updateSomeArr:function() 
    { 
     var temp = []; 

     for(var i=0;i<5;i++) 
     { 
      temp.push("555565"); 
     } 

     this.someArr(temp); 
    } 
} 
+0

haha ​​abbastanza semplice. Grazie – Neir0

+0

Nessun problema. C'è anche un modo per "disattivare" il comportamento osservativo, aggiornare il modello e poi riaccenderlo - ma non riesco a trovare la pagina per farlo. –

+0

utilizzando nome_array [nome_array.length-1] = elemento; è più veloce del metodo push – Marwan

3

Esiste già una risposta selezionata, ma ho pensato che la seguente avrebbe aiutato. È possibile disattivare il comportamento osservando eseguendo l'array osservabile per ottenere l'attuazione di matrice sottostante:

var underlyingArray = viewModel.someArr(); 

È quindi possibile aggiungere elementi underlyingArray senza sparare fuori someArr eventi. Una volta che hai finito di aggiungere elementi, chiamare:

viewModel.someArr.valueHasMutated(); 

Questo farà sì che l'evento al fuoco notificare tutte le osservabili dipendono da viewModel.someArr().

17
var myArray = ko.observableArray([]); 
var valuesToInsert = [1,2,3]; 
myArray.push.apply(myArray, valuesToInsert); 

il gioco è fatto

+0

Vorrei sapere perché la risposta è stata downvoted. – AGS

+0

Ancora non capisco perché la risposta più elegante e corretta è stata downvoted :). Sarei grato per una spiegazione. – AGS

+1

Questo è davvero l'approccio migliore per trasferire tutti gli elementi in un array in una sola volta.Qui è un post sul suo utilizzo http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html –