2009-02-18 9 views
6

मैं उपयोगकर्ता नियंत्रण में एक जेएस फ़ाइल शामिल करता हूं। होस्ट पेज में उपयोगकर्ता नियंत्रण के कई उदाहरण हैं।एकाधिक उपयोगकर्ता नियंत्रण और जावास्क्रिप्ट

जेएस फ़ाइल में एक वैश्विक चर है जिसका उपयोग जेएस फ़ंक्शन के लिए ध्वज के रूप में किया जाता है। मुझे इस चर के दायरे को उपयोगकर्ता नियंत्रण तक सीमित होना चाहिए। दुर्भाग्यवश, जब मेरे पास नियंत्रण के कई उदाहरण होते हैं, तो परिवर्तनीय मान ओवरराइट किया जाता है।

इस तरह की स्थिति में अनुशंसित दृष्टिकोण क्या है?

उत्तर

2

मैं आपके कोड को पुन: सक्रिय करने की अनुशंसा करता हूं जैसे कि सभी सामान्य जेएस तर्क एक ही स्थान पर संग्रहीत किया जाता है, न कि प्रत्येक उपयोगकर्ता नियंत्रण में। यह आपके पृष्ठ के आकार को एक अच्छे मार्जिन से कम कर देगा।

आप UserControls के बीच अंतर करने के लिए सामान्य जेएस विधि (ओं) में UserControl की आईडी में पास कर सकते हैं।

अपने 'UserControl' चर के दायरे को सीमित करने के मुद्दे के लिए, आप अपने UserControl- विशिष्ट मान को रखने के लिए किसी प्रकार की कुंजी/मान संरचना को स्टोर कर सकते हैं - कुंजी UserControl क्लाइंट आईडी होगी, और मान होगा वे चर जो आप रुचि रखते हैं।

उदाहरण के लिए:

var UCFlags = new Object(); 
//set the flag for UserControl1: 
UCFlags["UC1"] = true; 
//set the flag for UserControl2: 
UCFlags["UC2"] = false; 

उन तक पहुँचने के लिए, आप बस UCFlags सरणी में UserControl के ClientID पारित:

myFlag = UCFlags["UC1"]; 

सर्वर साइड पर, आप लगातार जगह ले सकता है तार "UC1" या "UC2"

<%= this.ClientID %> 

इस तरह के साथ:

+०१२३५१६४१०६
myFlag = UCFlags["<%= this.ClientID %>"]; 

आप अभी भी <% = this.ClientID%> सिंटैक्स का उपयोग कर सकते हैं भले ही जेएस का बड़ा हिस्सा एक अलग फ़ाइल में हो; बस जेएस फ़ाइल को एम्बेड करने के लिए कॉल से पहले

UCFlags["<%= this.ClientID %>"] = value; 

सेट करें।

+0

रयान - मेरे पास पृष्ठ पर उपयोगकर्ता नियंत्रण की संख्या हो सकती है। इसलिए, मैं निश्चित रूप से यूसीफ्लैग सरणी नहीं बना सकता। यूसीएफएलएजी ["यूसी 1"] = सत्य; यूसीएफएलएजी ["यूसी 2"] = झूठा; .. .. .. यूसीएफएलएजी ["यूसीएन"] = झूठा; –

+0

@ बॉब: मैं समझता हूं, लेकिन इस विधि के साथ आपको यह जानने की आवश्यकता नहीं है कि कितने और कितने यूसी हैं - बस यूसीएफएलएजी कह रहे हैं ["<% = this.ClientID%>"] = सत्य एक संपत्ति तैयार करेगा (डॉट क्लाइंट आईडी) UCFlags ऑब्जेक्ट पर, और 'true' मान को प्रारंभ करें। –

+0

आह, मुझे लगता है कि आप जावास्क्रिप्ट में हैश टेबल का उपयोग कर रहे हैं। यह पहली बार मैंने देखा एक सरणी की तरह लग रहा था :) धन्यवाद –

5

कुछ विकल्प गतिशील रूप से उपयोगकर्ता नियंत्रण के क्लाइंट आईडी के आधार पर जावास्क्रिप्ट उत्पन्न करना है। उदाहरण के लिए आप गतिशील रूप से वैश्विक चर उत्पन्न कर सकते हैं।

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

संपादित

मैं एक काम कोड नमूना है कि मैं साझा कर सकते हैं, लेकिन नहीं है, मैं एक जोड़े को अलग अलग तरीकों से यह किया है। सबसे आसान तरीका यह है कि इसे अपने उपयोगकर्ता नियंत्रण के मार्कअप में करें।

<script language='javascript'> 
    var <%=this.ClientID%>myObject=new myObject(); 
</script> 

अपने नियंत्रण मान लिया जाये कि myControl इस का एक clientid एक चर myControlmyObject बनाएगा है।

ऐसा करने का एक और तरीका यह है कि आप कोड के पीछे कोड में स्क्रिप्ट जेनरेट कर सकते हैं: Page.ClientScript.RegisterStartupScript()

<script type='text/javascript'> 
var <%= this.ClientID %>_name_of_global_variable; 
</script> 

कहाँ ":

+0

जोश के लिए वस्तु उन्मुख रास्ता लेने के लिए है - मैं अपने सिफारिश की दृष्टिकोण की तरह। क्या आपके पास कोड नमूना है? –

+0

@ बॉब: किसी कोड के नमूने के लिए मेरी प्रतिक्रिया देखें कि किसी ऑब्जेक्ट के भीतर चर को कैसे समाहित किया जाए। –

+0

जोश - यहां मैं समझता हूं कि मुझे क्या करना चाहिए: 1. यूसी के बीच साझा किए गए सभी कार्यों के साथ जेएस में एक कक्षा बनाएं 2. अपने कोड स्निपेट में दिखाए गए वर्ग का उदाहरण बनाएं 3. अगर मैं कॉल करता हूं MyControlmyObject.FunctionA() का उपयोग कर जेएस फ़ंक्शन, तो दायरा यूसी तक ही सीमित होगा? –

2

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

क्या यह समझ में आता है? इसे काम करने के लिए इसे न्यूनतम जावास्क्रिप्ट संशोधन करना चाहिए।

+0

जेएस एक अलग फ़ाइल में है और मैं क्लाइंट आईडी –

+0

इंजेक्ट करने के लिए <%= %> का उपयोग नहीं कर सकता हूं, यदि आप उस नियंत्रण के लिए अपने कोड-बैक में जावास्क्रिप्ट पंजीकृत करते हैं तो अवधारणा वही हो सकती है। – Carl

+0

(केवल कोड-बैक में वैश्विक चर की घोषणा पंजीकृत करें, यह है) – Carl

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