2009-01-09 2 views
5

मेरा पृष्ठ कई "स्टोर" ऑब्जेक्ट्स से संबंधित है, उनमें से प्रत्येक में 'डेटा' नामक फ़ील्ड है। हालांकि, यह डेटा AJAX अनुरोधों के माध्यम से प्राप्त किया जाता है जो समानांतर हो सकता है।एसिंक्रोनस AJAX कॉलबैक फ़ंक्शंस में कस्टम तर्कों को पारित करने के लिए jQuery कैसे प्राप्त करें?

function Store(id){ 
    this.id = id; 
    this.queryparam = 'blah'; 
    this.items = null; 
} 

Store.prototype.fetch = function(){ 
    $.get("/get_items",{q:this.quaryparam},function(data,status){ 

     // how to store the received data in this particular store object? Being 
     // a callback function, I don't have a reference to this object as 'this' 

     // this.data = data; //will not work 
    }); 
} 

कॉलबैक फ़ंक्शन मैं निम्नलिखित के रूप में बुला वस्तुओं के लिए एक डिफ़ॉल्ट पैरामीटर को परिभाषित करने की कोशिश की:

$.get("/get_items",{q:this.quaryparam},function(data,status, ref = this) ... 

लेकिन पता चला है कि जावास्क्रिप्ट इस तरह डिफ़ॉल्ट तर्क मूल्यों का समर्थन नहीं करता। क्या मैं किसी भी तरह कॉलबैक फ़ंक्शन में 'इस' स्टोर के संदर्भ को पास करने के लिए jquery प्राप्त कर सकता हूं?

मैं अन्य तरीकों की एक जोड़ी के बारे में सोचा, लेकिन उनमें से कोई भी काम:

मैं दुकान डेटा सिंक्रोनस अनुरोध का उपयोग कर सेट कर सकते हैं, लेकिन फिर नहीं AJAX की बात thats, यह क्या है?

स्टोर आईडी को उन अनुरोधों में भी भेजने के लिए एक और तरीका हो सकता है जो प्रतिक्रिया में वापस आ जाएंगे। उदाहरण के लिए:

// in Store.fetch() 
$.get("/get_items",{q:this.quaryparam,id:this.id},function(responsetext,status){ 
    var response = eval(responsetext); 
    stores[response.id].data = response.data; 
}); 

क्योंकि इस प्रतिक्रिया सिर्फ इसलिए कि क्लाइंट-साइड कोड ट्रैक जिनमें से अनुरोध जो वस्तु द्वारा भेजा गया था रखने में असमर्थ था प्रदूषित करता मैं इस दृष्टिकोण पसंद नहीं है।

इसके अलावा, क्योंकि store.id क्लाइंट-विशिष्ट है, यह सर्वर पर कैशिंग को गड़बड़ कर देगा। एक अलग अनुरोध यूआरएल का इस्तेमाल दो अलग-अलग स्टोर्स के लिए किया जाएगा, भले ही उनके पास एक ही क्वेरी पैरामीटर हों।

क्या मैं चाहता हूं कि हासिल करने के लिए कोई अन्य तरीका है?

उत्तर

5

आप बंद उपयोग करने के लिए सक्षम होना चाहिए:

var tmp = this; 
$.get("/get_items",{q:this.quaryparam},function(data,status){ 
    tmp.data = data; 
}); 

कि तुम क्या मतलब है?

2

फ़ंक्शन स्टोर (आईडी) { this.id = id; this.queryparam = 'blah'; this.items = null; }

Store.prototype.fetch = function(){ 
    var that = this; 
    $.get("/get_items",{q:this.quaryparam},function(response){ 
     that.callback(response) 
    }); 
} 

Store.prototype.callback = function(response){ 
    // and here you can use 
    this.items = response // just example 
} 
0

काम करने लगता है, हालांकि मुझे नहीं पता कि अज्ञात फ़ंक्शन के अंदर चर 'tmp' कैसे पहुंच योग्य है। :-)

धन्यवाद मार्क और रिचर्डो!

+1

यह वही है बंद करता है हो जाएगा। "बंद" और "व्याख्यात्मक दायरे" के लिए Google - जावास्क्रिप्ट में समझने के लिए ये महत्वपूर्ण अवधारणाएं हैं। –