2012-03-22 20 views
9

में आलसी लोडिंग मैं नॉकआउट जेएस के माध्यम से किसी बाहरी स्रोत से जेसन डेटा को लोड और पार्स करने की कोशिश कर रहा हूं।नॉकआउट जेएस

// Snippet 
    var self = this; 
    self.notices = ko.observableArray([]); 
    self.currentTab = ko.observable(5); 
    ko.computed(function() { 
     $.getJSON('http://json.source.here.com/tab/'+ko.toJS(self.currentTab), function(threads) { 
      if (threads !== null) { 
       self.notices(threads); 
      } else { 
       self.notices([]); 
      } 
     }); 
    }, self.notices); 

एक उपयोगकर्ता एक निश्चित टैब पर क्लिक करता है यह json डेटा (मंच धागे) चयनित टैब मूल्य (self.currentTab) पर के आधार पर लोड होगा: अब तक, सब कुछ निम्न कोड के माध्यम से सफल रहा है पंक्तियों के रूप में तालिका (self.notices)।

सब कुछ अपेक्षित काम करता है, हालांकि, मैंने देखा कि अन्य पृष्ठों के आसपास ब्राउज़ करते समय उपरोक्त बाइंडिंग नहीं है, जेसन अभी भी लोड हो रहा है ($ .getJSON निकाल दिया गया है)। मुझे चिंता है कि मेरी वेबसाइट के प्रदर्शन पर कुछ हानिकारक प्रभाव हो सकते हैं क्योंकि यह जसन स्रोत लोड कर रहा है, भले ही इसकी आवश्यकता नहीं है।

संपादित करें: मैंने इसे Google क्रोम के डेवलपर कंसोल के माध्यम से समझ लिया।

वर्तमान में मेरे पास एक जावास्क्रिप्ट फ़ाइल में मेरा दृश्य मॉडल है जिसका उपयोग हर दूसरे पृष्ठों द्वारा भी किया जा रहा है। इसमें सभी पृष्ठों के लिए बाइंडिंग शामिल हैं।

मेरा सवाल यह है कि, मैं किसी विशिष्ट पृष्ठ पर जेसन डेटा कैसे लोड कर सकता हूं या केवल बाइंडिंग मौजूद होने पर - आलसी लोडिंग? अधिमानतः, मैं सभी बाइंडिंग को एक ही जावास्क्रिप्ट फ़ाइल में रखना चाहता हूं, मैं उन्हें अलग नहीं करना चाहता हूं और उन्हें प्रति पेज आधार पर लोड करना चाहता हूं।

उत्तर

11

यहाँ एक लेख है कि मैं एक simliar विषय थोड़ी देर के पीठ पर लिखा है: http://www.knockmeout.net/2011/06/lazy-loading-observable-in-knockoutjs.html

आपके मामले में, मुझे लगता है कि तुम सच में $.getJSON कॉल के आसपास कुछ गार्ड को जोड़ने के लिए सुनिश्चित करने के लिए है कि यह केवल कर रहा है चाहता हूँ जब आप उचित स्थिति में हैं (उचित टैब पर) AJAX अनुरोध करता है।

कि साथ-साथ, ब्लॉग पोस्ट एक नमूदार अभिकलन पर deferEvaluation ध्वज का उपयोग सुनिश्चित करना है कि तर्क जब तक किसी को गणना की नमूदार के खिलाफ बांधता नहीं चलता है (आपके मामले में वर्णन करता है, तो आप एक गुमनाम गणना नमूदार है, लेकिन आप कर सकते थे इसे अपने दृश्य मॉडल में एक संपत्ति के रूप में जोड़ें और इसके दृश्य में इसके खिलाफ बाध्य करें। इस ध्वज के बिना, जब आप गणना किए गए अवलोकन योग्य बनाते हैं तो मूल्यांकन कोड चलाया जाएगा, जो आपके मामले में वांछनीय नहीं है।

+0

बहुत बहुत धन्यवाद :) मैं अपने नॉकआउट जेएस प्लगइन का उपयोग कर समाप्त हो गया। हालांकि, मैंने अपने उद्देश्य को बेहतर तरीके से सेवा देने के लिए "ko.observable" को "ko.observableArray" में बदल दिया - यह ठीक होना चाहिए? ऐसा लगता है कि अब उम्मीद की जा रही है। – MrSaints

+0

हाँ, यह कोई समस्या नहीं होनी चाहिए। सरणी संचालन को संभालने के लिए जोड़े गए कुछ अतिरिक्त तरीकों के साथ एक अवलोकन योग्य ऐरे वास्तव में एक अवलोकन योग्य है। –

+0

फिर से धन्यवाद। ओह और मैंने अभी देखा है कि जब मैं एक अलग टैब पर क्लिक करता हूं तो यह अद्यतन नहीं होता प्रतीत होता है। जब एक अवलोकन योग्य परिवर्तन सही होता है तो इसका पुनर्मूल्यांकन करना चाहिए? – MrSaints

संबंधित मुद्दे