2012-05-10 41 views
11

Knockout'daki Gözlemlenebilir nesneleri klonlamak için ne tür işlemler mekanizması oluşturmanın en iyi yolu nedir? Örneğin

bu modeli düzenleme:
Gözlemlenebilir klonlamanın en iyi yolu nedir?

var Action = function (name, ownerType, condition, expression, args) { 
    var self = this; 
    this.name = ko.observable(name); 
    this.ownerType = ko.observable(ownerType); 
    this.condition = ko.observable(condition); 
    this.expression = ko.observable(expression); 
    this.args = ko.observable(args); 
}; 

ben kullanıcı tarafından düzenlenemez önce o nesnenin durumunu kurtarmak istiyorum. Kullanıcı düzenleme işlemini iptal ederse - rollback nesne durumu. tıpkı başka proje oluşturun edilir

kolay yoludur:

self.tempAction = new Action(action.name(), action.ownerType(), action.condition(), action.expression(), action.args()); 

Ama zarif çözüm olduğundan emin değilim ..

Yani, herhangi bir fikir? O taklit jQuery'nin $.extend işlevi bir fonksiyonu var

İlk:

cevap

15

Ben genellikle aşağıdaki gibi bir şey yapmak. target nesnesini source nesnesinin observable (veya gözlenemeyen) özellik değerleriyle doldurur.

// extends observable objects intelligently 
ko.utils.extendObservable = function (target, source) { 
    var prop, srcVal, isObservable = false; 

    for (prop in source) { 

     if (!source.hasOwnProperty(prop)) { 
      continue; 
     } 

     if (ko.isWriteableObservable(source[prop])) { 
      isObservable = true; 
      srcVal = source[prop](); 
     } else if (typeof (source[prop]) !== 'function') { 
      srcVal = source[prop]; 
     } 

     if (ko.isWriteableObservable(target[prop])) { 
      target[prop](srcVal); 
     } else if (target[prop] === null || target[prop] === undefined) { 

      target[prop] = isObservable ? ko.observable(srcVal) : srcVal; 

     } else if (typeof (target[prop]) !== 'function') { 
      target[prop] = srcVal; 
     } 

     isObservable = false; 
    } 
    return target; 
}; 

Sonra aslında nesne JSON içine kopyalanacak dönüştürür ve sonra JSON kopyasını alır ve yeni bir JavaScript nesne inşa eden copy fonksiyonu var. Bu, tüm bellek işaretleyicilerinin kopyalanmamasını ve orijinalinizle eşleşen yepyeni bir nesneye sahip olmanızı sağlar.

var tempAction = ko.utils.clone(action, new Action()); 
: Burada bir anahtar

// then finally the clone function 
ko.utils.clone = function(obj, emptyObj){ 
    var json = ko.toJSON(obj); 
    var js = JSON.parse(json); 

    return ko.utils.extendObservable(emptyObj, js); 
}; 

Daha sonra öylesine gibi kullanabilirsiniz (aksi takdirde biz doldurmak için hangi özellikleri hiçbir fikrim yok olurdu) yeni bir nesne boş bir örneğine geçmek zorunda olmasıdır

+0

Orijinal kaynak nesneden yeni hedef nesnesine eşlemek için ko.mapping eklentisini kullanamaz mısınız? – jaffa

+0

@jaffa - evet, haritalama eklentisi uygun bir seçenek olurdu. Ancak önemsiz ihtiyaçlar için aşırı olabilir. Ayrıca, eşleme eklentisinin uygulama genişliğine ihtiyaç duyulmadığı durumlarda 'extendObservable' işlevini oldukça kullanışlı buldum. – ericb

+0

Bu, ko.computed değerleri ile nasıl çalışır? Bir nesneyi kopyalamak için JSON ve JSON.parse kullanarak tüm hesaplama değerlerini kaybedeceğini düşünürdüm. –

İlgili konular