2012-09-25 9 views
9

किसी भी एक मुझे, कैसे एक वस्तु इसे से जुड़े के साथ actionscript3 में एक घटना प्रेषण करने के लिए पर एक सरल उदाहरण दे सकते हैंकैसे जोड़ा डेटा के साथ एक घटना प्रेषण करने के लिए - AS3

dispatchEvent(new Event(GOT_RESULT,result)); 
यहाँ

result की तरह एक वस्तु है कि मैं घटना के साथ पास करना चाहता हूँ।

+1

आप एक उदाहरण अपने आप को दे दी है। आप वास्तव में कहाँ अटक गए हैं? – bfavaretto

+0

उत्तर के लिए धन्यवाद, मैं as3 के लिए नया हूं और जानना चाहता हूं कि प्रेषण ईवेंट के साथ ऑब्जेक्ट को कैसे पास किया जाए? – user1022521

+1

आपको अपनी खुद की कस्टम इवेंट ऑब्जेक्ट बनाने के लिए इवेंट क्लास का विस्तार करना होगा। यहां एक उदाहरण देखें: http://cookbooks.adobe.com/post_AS3__Creating_and_dispatching_Custom_Events-17609.html – bfavaretto

उत्तर

30

यदि आप किसी ईवेंट के माध्यम से ऑब्जेक्ट पास करना चाहते हैं तो आपको एक कस्टम ईवेंट बनाना चाहिए। कोड इस तरह कुछ होना चाहिए।

public class MyEvent extends Event 
{ 
    public static const GOT_RESULT:String = "gotResult"; 

    // this is the object you want to pass through your event. 
    public var result:Object; 

    public function MyEvent(type:String, result:Object, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
     this.result = result; 
    } 

    // always create a clone() method for events in case you want to redispatch them. 
    public override function clone():Event 
    { 
     return new MyEvent(type, result, bubbles, cancelable); 
    } 
} 

तो फिर तुम इस तरह से ऊपर कोड का उपयोग कर सकते हैं:

dispatchEvent(new MyEvent(MyEvent.GOT_RESULT, result)); 

और आप इस घटना को जहां आवश्यक के लिए सुन।

addEventListener(MyEvent.GOT_RESULT, myEventHandler); 
// more code to follow here... 
protected function myEventHandler(event:MyEvent):void 
{ 
    var myResult:Object = event.result; // this is how you use the event's property. 
} 
+0

इस तरह यह किया जाना चाहिए। कुछ छोटे जोड़; मैं हमेशा ईवेंट डेटा के लिए सार्वजनिक क्षेत्र के बजाय गेटर फ़ील्ड का उपयोग करता हूं। मैं इसे स्पष्ट रखने के लिए परिणाम के लिए GOT_RESULT का नाम बदलूंगा। –

+2

बीटीडब्ल्यू मैंने कस्टम एएस 3 इवेंट बनाने के लिए एक ऑनलाइन टूल बनाया है http://projects.stroep.nl/EventGenerator/ यह सेटअप को तेज़ी से मदद कर सकता है। उपयोग करने के लिए स्वतंत्र महसूस करें। –

+1

मैं इवेंट निरंतर परिणाम को पुन: नामित करने के बारे में सहमत हूं, मैं बस ओपी के उदाहरण परिवर्तनीय नामों के लिए जितना संभव हो उतना करीब रखने की कोशिश कर रहा था ताकि किसी भी भ्रम से उत्पन्न हो सके। –

0

यदि सही तरीके से डिज़ाइन किया गया है तो आपको ईवेंट पर किसी ऑब्जेक्ट को पास नहीं करना चाहिए।
इसके बजाय आपको प्रेषण कक्षा पर सार्वजनिक var बनाना चाहिए।

public var myObject:Object; 

// before you dispatch the event assign the object to your class var 
myObject = ....// whatever it is your want to pass 
// When you dispatch an event you can do it with already created events or like Tomislav wrote and create a custom class. 

// in the call back just use currentTarget 
public function myCallBackFunction(event:Event):void{ 

    // typecast the event target object 
    var myClass:myClassThatDispatchedtheEvent = event.currentTarget as myClassThatDispatchedtheEvent 
    trace(myClass.myObject)// the object or var you want from the dispatching class. 


+0

क्या आप कह रहे हैं कि किसी ऑब्जेक्ट को पास करना एक खराब डिज़ाइन निर्णय है, या सिर्फ एक विकल्प दे रहा है? मैं पूछ रहा हूं क्योंकि फ़्लैश/फ्लेक्स एपीआई अक्सर वस्तुओं को पारित करने लगते हैं। – bfavaretto

+4

अगर मैं समझता हूं कि आपने अभी क्या कहा है; मैं सम्मान से असहमत हूं। ईवेंट ऑब्जेक्ट्स में मान जोड़ना अच्छा encapsulation है। कई मामलों में, मैं उस दृष्टिकोण को प्राथमिक लक्ष्य (या लक्ष्य) के निरीक्षण के विपरीत एक उदाहरण पर सार्वजनिक वर्र्स से डेटा पुनर्प्राप्त करने के विपरीत पसंद करूंगा। मुझे यह विशेष रूप से फायदेमंद लगता है एक प्रदर्शन सूची में जहां एक कार्यक्रम प्रदर्शन पदानुक्रम में कई स्तरों को बुलबुला करेगा। – JeffryHouser

+3

जबकि मैं कभी-कभी इस पद्धति का उपयोग करता हूं, यह हर परिदृश्य के लिए उपयुक्त नहीं है (आपका पहला वाक्य यह सुझाव देगा)। उदाहरण के लिए, यदि आपके पास एक ही घटना को प्रेषित करने वाली कई कक्षाएं हैं (लेकिन एक सामान्य उप-वर्ग नहीं है), तो उन मामलों में एक कस्टम ईवेंट एक बहुत साफ मार्ग है। इसके अलावा ब्याज को अलग करने के बारे में कुछ कहना है।यदि इस कार्यक्रम को प्रेषित करने वाले वर्ग के पास उस वर्ग के बारे में जानने का कोई कारण नहीं है जो घटना सुन रहा/संभाला जा रहा है, तो उस स्थिति के लिए एक कस्टम घटना भी बेहतर है। यूनिट परीक्षण बहुत आसान बनाता है – BadFeelingAboutThis

3

इस पोस्ट में एक छोटे से पुराना है लेकिन अगर यह किसी की मदद कर सकते हैं, तो आप ऐसा तरह DataEvent वर्ग का उपयोग कर सकते हैं:

dispatchEvent(new DataEvent(YOUR_EVENT_ID, true, false, data)); 

Documentation

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