2009-07-31 11 views
12

यदि आपके पास dojo.connect के दौरान लौटाया गया "हैंडल" नहीं है तो आप डोजो कनेक्टेड ईवेंट को कैसे हटा सकते हैं?यदि आपके पास dojo.connect के दौरान लौटाया गया "हैंडल" नहीं है तो आप डोजो कनेक्टेड ईवेंट को कैसे हटा सकते हैं?

मेरे उदाहरण में गतिशील रूप से ऑब्जेक्ट्स के सेट पर ईवेंट का एक सेट असाइन करना शामिल है। (सादगी के लिए, घटनाएं ऑनक्लिक और ऑनडब्लक्लिक हैं, और ऑब्जेक्ट्स टेबल के भीतर पंक्तियां हैं)

तो, पेज सेटअप ईवेंट के दौरान प्रत्येक पंक्ति (ऑनक्लिक, ऑनडब्लक्लिक) से कनेक्ट होते हैं। अब, उपयोगकर्ता इच्छाओं/कार्यों के आधार पर, एक पंक्ति से एक घटना को हटाने की आवश्यकता आवश्यक है। लेकिन मूल हैंडल अब उपलब्ध नहीं है। इसके कारण निम्नलिखित काम नहीं करेंगे: dojo.disconnect(row, "onclick", ??*)। मूल पंक्ति संरचना हैकिंग किए बिना मैं इसके आसपास कैसे हो सकता हूं?

किसी भी मदद की सराहना की है।

उत्तर

9

मैं आमतौर पर जो करता हूं वह हैंडल को सहेजते समय उन्हें सहेजता है ताकि मैं उन्हें बाद में डिस्कनेक्ट कर सकूं। कुछ की तरह:

dojo.forEach(connects[node.id], function(handle) { 
    dojo.disconnect(handle); 
}); 

वहाँ एक समान कोड घटनाओं — मैं दूर करने के लिए dojocampus

+0

कनेक्ट [node.id] अपरिभाषित है => आपको पहले इसे {} या [] असाइन करना होगा। –

+0

धन्यवाद। अद्यतन उत्तर – seth

+0

यह उत्तर सही के रूप में चिह्नित किया गया है लेकिन यह प्रश्न का उत्तर नहीं देता है क्योंकि यह अभी भी हैंडल पर निर्भर करता है। – moliveira

9
सेठ की तरह

मैं अपने पैटर्न है पर इस बात के लिए नमूना है:

var connects = {}; 

// then later on 
var node = dojo.create(....); // or someting else that gives you a node 
dojo.forEach(['click','ondblclick' ], function(evt, idx) { 
    if (!connects[node.id]) { 
    connects[node.id] = []; 
    } 
    connects[ node.id ][idx] = dojo.connect(node, evt, function(evt) { .... }); 
}); 
बाद में

उसके बाद, आप पर की तरह डिस्कनेक्ट कर सकते हैं सरणी (छद्म कोड) में हैंडल एकत्र करें:

var handles = [ 
    dojo.connect(...), 
    dojo.connect(...), 
    dojo.connect(...) 
]; 

अगर मैं गतिशील रूप से कनेक्ट मैं सिर्फ उन्हें इकट्ठा:

var handles = []; 
... 
handles.push(dojo.connect(...)); 
... 
handles.push(dojo.connect(...)); 

अगर मैं एक नियमित तरीके से कई घटनाओं कनेक्ट मैं dojo.map() उपयोग कर सकते हैं:

var handles = dojo.map(["click", "ondblclick"], function(evt){ 
    return dojo.connect(node, evt, ...); 
}); 

साफ बात यह है कि बाद में मैं उन सभी के साथ डिस्कनेक्ट कर सकते हैं है एक आसान एक लाइनर:

dojo.forEach(handles, dojo.disconnect); 

आपके मामले में आप एक ही पूरा करने के लिए सेठ द्वारा दिखाया की तरह एक शब्दकोश का उपयोग कर सकते हैं:

var handles = {}; 
... 
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){ 
    return dojo.connect(node, evt, ...); 
}); 

तो बाद में एक आप इस तरह संचालकों डिस्कनेक्ट कर सकते हैं:

dojo.forEach(handles[node.id], dojo.disconnect); 

कर देखें कि कहीं सेठ 'और मेरे नमूने अपने मामले में मदद करते हैं। यदि नहीं, तो हमें और विवरण दें।

10

आपके प्रश्न का उत्तर यह है कि अगर आप "हैंडल" खो चुके हैं जो dojo.connect ऑपरेशन के दौरान लौटाया गया है तो ईवेंट को डिस्कनेक्ट करना असंभव है। सिवाय इसके कि आप डोजो कोड के भारी हैकिंग करने के लिए तैयार हैं या नहीं।

यदि आप उन्हें बाद में डिस्कनेक्ट करना चाहते हैं तो आपको इन्हें कहीं भी स्टोर करना होगा।

2

हालांकि डोजो ऐसा करने के लिए एक रास्ता नहीं है, आप मानक जावा स्क्रिप्ट के साथ एक नामित समारोह निकाल सकते हैं:

node.removeEventListener ("click", clickFunction, false); 

See it in action here।हालांकि, RemoveEventListener केवल इंटरनेट एक्सप्लोरर के लिए आईई 9 के रूप में समर्थित है। यह अन्य सभी प्रमुख ब्राउज़रों पर काम करना चाहिए।

0

घटना एक Dijit विजेट से जुड़ा है, तो आप सभी संचालकों घटना पर तो जैसे ओवरराइड कर सकते हैं:

dijit.byId(widgetid).onClick = function() { 
    // click handler or empty function goes here 
} 

किसी भी और सभी कार्यों कि विजेट के लिए click हैंडलर से जुड़ी अपनी नई से बदल दिया जाएगा हैंडलर पर क्लिक करें।