Nakavt. veri (yaklaşık 400 satır).
Modelimde aşağıdaki koda sahibim:
this.projects = ko.observableArray( [] ); //Bind to empty array at startup
this.loadData = function (data) //Called when AJAX method returns
{
for(var i = 0; i < data.length; i++)
{
this.projects.push(new ResultRow(data[i])); //<-- Bottleneck!
}
};
Sorun, for
yukarıdaki döngünün yaklaşık 400 satırla yaklaşık 30 saniye sürmesidir. Ancak kodu şu şekilde değiştirirsem:
this.loadData = function (data)
{
var testArray = []; //<-- Plain ol' Javascript array
for(var i = 0; i < data.length; i++)
{
testArray.push(new ResultRow(data[i]));
}
};
Ardından for
döngü göz açıp kapayıncaya kadar tamamlanır. Başka bir deyişle, push
Knockout'un observableArray
nesnesinin yöntemi inanılmaz derecede yavaştır.
İşte şablonum:
<tbody data-bind="foreach: projects">
<tr>
<td data-bind="text: code"></td>
<td><a data-bind="projlink: key, text: projname"></td>
<td data-bind="text: request"></td>
<td data-bind="text: stage"></td>
<td data-bind="text: type"></td>
<td data-bind="text: launch"></td>
<td><a data-bind="mailto: ownerEmail, text: owner"></a></td>
</tr>
</tbody>
Sorularım:
- Verilerimi (AJAX yönteminden gelen) gözlemlenebilir bir koleksiyona bağlamanın doğru yolu bu mu?
- Sanırım
push
onu her çağırdığımda yoğun bir yeniden hesaplama yapıyor, örneğin bağlı DOM nesnelerini yeniden inşa etmek gibi. Ya bu itirazı ertelemenin bir yolu var mı, yoksa tüm eşyalarımı aynı anda içeri itmenin bir yolu var mı?
Gerekirse daha fazla kod ekleyebilirim, ancak konuyla ilgili olanın bu olduğundan oldukça eminim. Çoğunlukla, sitedeki Nakavt eğitimlerini takip ediyordum.
GÜNCELLEME:
Aşağıdaki tavsiyeye göre kodumu güncelledim:
this.loadData = function (data)
{
var mappedData = $.map(data, function (item) { return new ResultRow(item) });
this.projects(mappedData);
};
Ancak this.projects()
yine de 400 satır için yaklaşık 10 saniye sürer. Nakavt olmadan bunun ne kadar hızlı olacağından emin değilim (sadece DOM aracılığıyla satırlar ekleyerek), ancak 10 saniyeden çok daha hızlı olacağını hissediyorum.
GÜNCELLEME 2:
Aşağıdaki diğer tavsiyelere göre, jQuery.tmpl'e bir şans verdim (doğal olarak KnockOut tarafından destekleniyor) ve bu şablon oluşturma motoru 3 saniyeden fazla bir sürede yaklaşık 400 satır çekecek. Bu, siz kaydırdıkça daha fazla veriyi dinamik olarak yükleyecek bir çözümün yanı sıra en iyi yaklaşım gibi görünüyor.