2011-11-02 10 views
7

¿Cómo agregar todos los valores a observableArray al mismo tiempo? Agregar valores en bucle funciona muy lento en mi caso. Aquí está el ejemplo jsfiddle. jsfiddleknockout observable rendimiento de Array

+0

tengo una nota sobre los artículos para agregarlos al problema de rendimiento matriz que se debe utilizar array_name [array_name.length-1] = su artículo; esta línea es más rápida que el método de inserción – Marwan

+0

¿La diferencia es realmente grande? – Neir0

+0

creo que sí, vea este artículo http://www.scottlogic.co.uk/2010/10/javascript-array-performance/ y lo siento, he confundido su array_name [array_name.length] = su elemento – Marwan

Respuesta

7

Puesto que usted está limpiando toda la matriz observable, una forma que puede lograr esto es:

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

jaja bastante simple. Gracias – Neir0

+0

No hay problema. También hay una manera de "desactivar" el comportamiento de observación, actualizar su modelo y luego volver a encenderlo, pero parece que no puedo encontrar la página para ello. –

+0

usando array_name [array_name.length-1] = item; es más rápido que el método push – Marwan

3

Ya existe una respuesta seleccionada, pero pensé que la siguiente ayudaría. Se puede desactivar el comportamiento de observación mediante la ejecución de su gama observables para conseguir la aplicación de la matriz subyacente:

var underlyingArray = viewModel.someArr(); 

continuación, se puede añadir elementos a underlyingArray sin disparar fuera someArr eventos. Una vez que haya terminado la adición de elementos, llame a:

viewModel.someArr.valueHasMutated(); 

Esto hará que el evento al fuego notificar todos los observables depende de viewModel.someArr().

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

eso es todo

+0

Me gustaría saber por qué la respuesta fue downvoted. – AGS

+0

Todavía no entiendo por qué la respuesta más elegante y correcta fue downvoted :). Estaría agradecido por una explicación. – AGS

+1

Este es realmente el mejor enfoque para enviar todos los elementos a una matriz a la vez. Aquí hay una publicación sobre su uso http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html –

Cuestiones relacionadas