मैं सिर्फ नॉकआउट के साथ शुरुआत कर रहा हूँ। (हमेशा इसे आज़माना चाहता था, लेकिन अब मेरे पास आखिरकार एक बहाना है!) - हालाँकि, मैं एक अपेक्षाकृत छोटे सेट के लिए एक टेबल बांधते समय कुछ बहुत खराब प्रदर्शन समस्याओं में भाग रहा हूं। डेटा (लगभग 400 पंक्तियों या तो)।
मेरे मॉडल में, मेरा निम्नलिखित कोड है:
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!
}
};
मुद्दा यह है कि for
ऊपर वाला लूप लगभग 30 सेकंड या लगभग 400 पंक्तियों के साथ है। हालाँकि, अगर मैं कोड को इसमें बदल दूं:
this.loadData = function (data)
{
var testArray = []; //<-- Plain ol' Javascript array
for(var i = 0; i < data.length; i++)
{
testArray.push(new ResultRow(data[i]));
}
};
फिर for
लूप एक आंख की झपकी में पूरा होता है। दूसरे शब्दों में, push
नॉकआउट की observableArray
वस्तु की विधि अविश्वसनीय रूप से धीमी है।
यहाँ मेरा टेम्पलेट है:
<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>
मेरे सवाल:
- क्या यह मेरे डेटा (जो एक AJAX विधि से आता है) को एक नमूदार संग्रह में बाँधने का सही तरीका है?
- मुझे उम्मीद
push
है कि मैं हर बार कॉल करने के दौरान कुछ भारी फिर से कैल्क कर रहा हूं, जैसे कि बाध्य डोम ऑब्जेक्ट्स का पुनर्निर्माण करना। वहाँ एक रास्ता है या तो इस पुनर्गणना में देरी, या शायद एक ही बार में मेरे सभी मदों में धक्का?
यदि आवश्यक हो तो मैं और अधिक कोड जोड़ सकता हूं, लेकिन मुझे पूरा यकीन है कि यह प्रासंगिक है। अधिकांश भाग के लिए मैं साइट से नॉकआउट ट्यूटोरियल का अनुसरण कर रहा था।
अपडेट करें:
नीचे दी गई सलाह के अनुसार, मैंने अपना कोड अपडेट कर दिया है:
this.loadData = function (data)
{
var mappedData = $.map(data, function (item) { return new ResultRow(item) });
this.projects(mappedData);
};
हालांकि, this.projects()
400 पंक्तियों के लिए अभी भी लगभग 10 सेकंड लगते हैं। मैं मानता हूं कि मुझे यकीन नहीं है कि यह नॉकआउट के बिना कितनी तेजी से होगा (सिर्फ डोम के माध्यम से पंक्तियों को जोड़ना), लेकिन मुझे लगता है कि यह 10 सेकंड से ज्यादा तेज होगा।
अद्यतन 2:
नीचे दी गई अन्य सलाह के अनुसार, मैंने jQuery.tmpl को एक शॉट दिया (जो कि मूल रूप से नॉकऑउट द्वारा समर्थित है), और यह अस्थायी इंजन केवल 3 सेकंड में लगभग 400 पंक्तियों को आकर्षित करेगा। यह सबसे अच्छा तरीका है, एक समाधान की कमी जैसा कि आप स्क्रॉल करते समय अधिक डेटा में लोड करेंगे।