2011-06-28 19 views

cevap

57

yapmak istediğiniz olacaktır:

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

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

İsterseniz sadece bir kopya yapmak için, o zaman yapardınız:

viewModel.array1(viewModel.array2()); 

İkinci örnekle ilgili sorun, temeldeki dizinin aynı olması, yani dizi1 veya dizi2'ye basılması, her ikisinin de yeni değere sahip olmasıyla sonuçlanır (her ikisi de aynı diziye işaret ettikleri gibi).

+2

Evet Sadece bir referans kopyası yerine dizinin bir değer kopyasını istiyorum, böylece ilk seçeneğim benim senaryo için en uygun olacak şekilde olmalıdır, teşekkürler. – jaffa

+4

Deneyimlerime göre, gözlemlenebilir dizileriniz gözlemlenebilir özelliklerle doluysa, bu, gözlemlenebilirliklerin kendileri nesneler olduğu için, referansla kopyalanmış gibi görünüyor. Dilim nesneleri referans olarak kopyalar. Nakavt dizilerini derinlemesine klonlamayı biliyor musunuz? – PrinceTyke

1

böyle bir şey var bir observableArray klonlamak için

modelB.iWantYourValues(modelA.someValues()) 
42

Aynı görevde bulundum; gözlemlenebilir bir diziyi klonlamak için. Bunu nasıl yapabildiğimi anlayabilmemin tek yolu, bir JS nesnesine gözlemlenebilir olanı dönüştürmek ve sonra bu nesneyi gözlemlenebilir bir nesneye dönüştürmektir. http://knockoutjs.com/documentation/plugins-mapping.html

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

Umut bu soruyorsun Tam olarak ne

+7

Dikkatli olun, bu 'ko.computed() 'ile karıştırır, sadece değer depolar, klonlandıktan sonra' bilgisayarlı'yı yeniden tanımlamanız gerekir. – Anri

+0

@Anri - Yorumunuzu gönderdiğiniz için teşekkür ederiz ... saatlerce kurtardı! Garry - lütfen bununla birlikte cevabı güncelleyin! – Kevin

+4

knockoutJS eşleme eklentisini kullanmak istemiyorsanız, başka bir seçenek nesneyi JSON'a dönüştürmek ve ayrıştırılmış json verilerini kullanarak yeni bir tane oluşturmaktır. Eşleme eklentisini sadece burada ihtiyacım olduğu gibi eklemek istemediğimden beri: 'self.myObservable (yeni koModel (JSON.parse (ko.toJSON (eskiObservable)))) – Gigi2m02

0

yardımcı olur, ancak ben kuşaklar için bu eklemek istiyorum ...

edin: Aşağıdaki fonksiyon KnockoutJS haritalama eklentisi gerektiren orijinal ile (çoğunlukla orijinali korurken, kısaltılmış/ayrıştırılmış bir klon oluşturmak için) en sık rastlanan bir gözlemlenebilir klonlamak istediğinizde, aşağıdaki gibi bir şey yapabilirsiniz:

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

İlgili konular