2011-06-28 21 views

Respuesta

57

Para clonar un observableArray que se quiere hacer:

var viewModel = { 
    array1: ko.observableArray(["one", "two"]), 
    array2: ko.observableArray() 
}; 

viewModel.clone = function() { 
    viewModel.array1(viewModel.array2.slice(0)); 
}; 

Si quieren para hacer una copia, lo haría:

viewModel.array1(viewModel.array2()); 

El problema con el segundo ejemplo es que la matriz subyacente es la misma, por lo que presionar a array1 o array2 daría como resultado que ambos tengan el nuevo valor (ya que ambos apuntan a la misma matriz).

+2

Sí, solo quiero una copia de valor de la matriz en lugar de una copia de referencia, por lo que la primera opción debería ser la más adecuada para mi escenario, gracias. – jaffa

+4

En mi experiencia, esto parece copiar por referencia si sus matrices observables están llenas de propiedades observables porque los observables mismos son objetos. Slice copia objetos por referencia. ¿Sabes cómo clonar profundamente las matrices knockout? – PrinceTyke

1

Asumiendo que tienen algo así como:

modelA { someValues: observableArray(); } 
modelB { iWantYourValues: observableArray(); } 

Usted debe ser capaz de:

modelB.iWantYourValues(modelA.someValues()) 
42

Me enfrenté a la misma tarea; para clonar una matriz observable. La única forma en que pude descubrir cómo hacerlo, es convertir lo observable en un objeto JS, y luego convertir ese objeto en un objeto observable. La siguiente función requiere KnockoutJS plugin de mapeo: http://knockoutjs.com/documentation/plugins-mapping.html

function cloneObservable(observableObject) { 
    return ko.mapping.fromJS(ko.toJS(observableObject)); 
} 

espero que esto ayude

+7

Tenga cuidado, esto se confunde con 'ko.computed()', almacena solo el valor, tiene que redefinir 'computado' después del clon. – Anri

+0

@Anri - Gracias por publicar tu comentario ... ¡me ahorró horas! Garry - por favor actualiza la respuesta con esto! – Kevin

+4

Si no desea utilizar el complemento de asignación knockoutJS, otra opción es convertir su objeto a JSON y crear uno nuevo utilizando los datos json analizados. Como no quería incluir el plugin de mapeo ya que solo lo necesito aquí, lo hice: 'self.myObservable (nuevo koModel (JSON.parse (ko.toJSON (oldObservable))))' – Gigi2m02

0

No es exactamente lo que estás pidiendo, pero me gustaría añadir esto para la posteridad ...

Si Si desea clonar un elemento observable que permanezca sincronizado con el original (lo más a menudo posible para crear un clon acelerado/antirrebotes mientras mantiene el original), puede hacer algo como tal:

const clone = ko.pureComputed(() => original()).extend({ rateLimit: 500 })

Cuestiones relacionadas