2013-11-26 15 views
6

Elde etmek istediğim, model özellikleri için abonelik oluşturmaktır. Bu abonelik fonksiyonu, veritabanında Ajax güncelleme özelliği üzerinden WebApi'yi çağırmalıdır. Ajax çağrısı için üç paramatere ihtiyacım var: "fieldName", "fieldValue" ve "modelId" ajax, bu üç parametreye dayalı olarak veritabanı satırını güncelleyecektir.knockout abonelik işlevine ek parametreler iletme

ko.subscribable.fn.withUpdater = function (handler) { 
    var self = this;  
    this.subscribe(handler);  
    //support chaining 
    return this;  
}; 

Bunu ekle o "nasıl olduğunu:

Birçok özelliklere sahip ve hepsi aynı işlevselliği gerek, bu yüzden tek tek her özellik için abone olmak istemiyorum, bu yüzden bir şu öneride bulundu gözlenebilirlere "ekli: update modeli dışında bazı js fonksiyonudur

self.ModelId= ko.observable(); 
self.CompanyName = ko.observable().withUpdater(update); 

. Ben update fonksiyonları (- Ben update içeride viewModel.ModelId özellik değerini elde edebilmek için gereken yanı sıra propertyName ya da başka bir deyişle söyleyebiliriz) üç parametrelerinin geçmek değil mümkün çünkü

Ancak, ben, sorun var . Şirket adı özelliği için bir örnek olarak

function update (propertyName, propertyNewValue, anotherPropertyValue) { 
    //do ajax update 
} 

öyle olacak:

update("CompanyName", "New Company value here", 3), 

nerede

3 == viewModel.ModelId 
+0

Cevabımı güncelledim ve nereye gittiğinizi merak ediyorum. – lucuma

cevap

1

Orada bunu yapmak için daha iyi bir yolu olabilir ama şu çalışır olacaktır:

Öncelikle, withUpdate yöntemine bir hedef nesne ekleyin:

ko.subscribable.fn.withUpdater = function (handler, target, propname) { 
    var self = this; 

    var _oldValue; 
    this.subscribe(function (oldValue) { 
     _oldValue = oldValue; 
    }, null, 'beforeChange'); 

    this.subscribe(function (newValue) { 
    handler.call(target, _oldValue, newValue, propname); 
    }); 

     return this;  
}; 

güncellemefonksiyon hedef mülkiyet kapsamına alacak abone:

var update = function (propertyName) { 
    console.log('propname is '+ propname + ' old val: ' + oldvalue + ', new val: ' + newvalue + ', model id: ' + this.ModelId()); 
} 

Şimdi farklı bunu biraz kullanmak gerekecektir.

self.CompanyName = ko.observable().withUpdater(update, self, "CompanyName"); 

bir örnek http://plnkr.co/edit/HhbKEm?p=preview

açıkça hedef ve şirket adı için bir dizede geçen olmadan nesnenin o olmaya withUpdater fonksiyonunun kapsamını alamadım.

+0

Bana, update işlevi ilk paramater'da propertyValue ve propertyName değerini vermez. – renathy

+0

Eski adı, özellik adını, yeni değeri ve model kimliğini eklemek için her ikisini de güncelledim, ancak özellik adına bir dize iletmek zorunda kalmadan yapmak için daha elverişli bir yol olup olmadığını merak ediyorum. – lucuma