2009-04-02 11 views
8

मुझे एएस 3 इवेंट मॉडल पसंद है - यह मेरे कोड को साफ और हानिकारक युग्मित रखने में मदद करता है। जब मैं एएस 2 परियोजनाओं पर काम करता था, तो मेरा कोड इतना साफ नहीं था और कक्षाएं एक दूसरे पर अधिक निर्भर थीं। एएस 2 के दायरे के अजीब हैंडलिंग के कारण मैं वास्तव में एएस 2 इवेंट सिस्टम के साथ कभी नहीं मिला।एक्शनस्क्रिप्ट 2 घटनाओं के लिए सर्वश्रेष्ठ अभ्यास - क्या एक्शनस्क्रिप्ट 3-शैली की घटनाओं को अनुकरण करने का कोई तरीका है?

मैं अब भी कभी-कभी AS2 में काम करना है, मेरे सवाल यह है:

किसी AS2 में AS3 घटना एपीआई अनुकरण में कामयाब रहा है, और यदि नहीं, सुनने और घटनाओं भेजने और के लिए सबसे अच्छा अभ्यास क्या है निपटान गुंजाइश?

उत्तर

9

वास्तव में ऐसा करने में काफी आसान है। आपको कुछ कक्षाएं मिलनी चाहिए। पहले, एक Event वर्ग जा रहा है इस प्रकार है:

class com.rokkan.events.Event 
{ 

    public static var ACTIVATE:String = "activate"; 
    public static var ADDED:String = "added"; 
    public static var CANCEL:String = "cancel"; 
    public static var CHANGE:String = "change"; 
    public static var CLOSE:String = "close"; 
    public static var COMPLETE:String = "complete"; 
    public static var INIT:String = "init"; 

    // And any other string constants you'd like to use... 

    public var target; 
    public var type:String; 

    function Event($target, $type:String) 
    { 
     target = $target; 
     type = $type; 
    } 

    public function toString():String 
    { 
     return "[Event target=" + target + " type=" + type + "]"; 
    } 
} 

फिर, मैं दो अन्य आधार वर्ग का उपयोग करें। नियमित वस्तुओं और वस्तुओं के लिए एक जिन्हें MovieClip का विस्तार करने की आवश्यकता है। सबसे पहले गैर MovieClip संस्करण ...

import com.rokkan.events.Event; 
import mx.events.EventDispatcher; 

class com.rokkan.events.Dispatcher 
{ 

    function Dispatcher() 
    { 
     EventDispatcher.initialize(this); 
    } 

    private function dispatchEvent($event:Event):Void { } 
    public function addEventListener($eventType:String, $handler:Function):Void { } 
    public function removeEventListener($eventType:String, $handler:Function):Void { } 
} 

अगला MovieClip संस्करण ...

import com.rokkan.events.Event; 
import mx.events.EventDispatcher; 

class com.rokkan.events.DispatcherMC extends MovieClip 
{ 

    function DispatcherMC() 
    { 
     EventDispatcher.initialize(this); 
    } 

    private function dispatchEvent($event:Event):Void { } 
    public function addEventListener($eventType:String, $handler:Function):Void { } 
    public function removeEventListener($eventType:String, $handler:Function):Void { } 
} 

आप या तो डिस्पैचर या DispatcherMC के साथ अपने वस्तुओं का विस्तार करने और आप घटनाओं प्रेषण करने के लिए सक्षम हो जाएगा और घटनाओं के लिए सुनने एएस 3 के समान। बस कुछ quirks हैं। उदाहरण के लिए, जब आप dispatchEvent() पर कॉल करते हैं तो आपको ईवेंट को प्रेषित करने वाले ऑब्जेक्ट के संदर्भ में पास करना होगा, आमतौर पर केवल ऑब्जेक्ट की this संपत्ति का जिक्र करते हुए।

import com.rokkan.events.Dispatcher; 
import com.rokkan.events.Event; 

class ExampleDispatcher extends Dispatcher 
{ 
    function ExampleDispatcher() 
    { 

    } 

    // Call this function somewhere other than within the constructor. 
    private function notifyInit():void 
    { 
      dispatchEvent(new Event(this, Event.INIT)); 
    } 
} 

अन्य क्विर्क तब होता है जब आप उस घटना को सुनना चाहते हैं। एएस 2 में आपको इवेंट हैंडलिंग फ़ंक्शन का सही दायरा प्राप्त करने के लिए Delegate.create() का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

import com.rokkan.events.Event; 
import mx.utils.Delegate; 

class ExampleListener 
{ 
    private var dispatcher:ExampleDispatcher; 

    function ExampleDispatcher() 
    { 
     dispatcher = new ExampleDispatcher(); 
     dispatcher.addEventListener(Event.INIT, Delegate.create(this, onInit); 
    } 

    private function onInit(event:Event):void 
    { 
     // Do stuff! 
    } 
} 

उम्मीद है कि मैंने अपनी पुरानी फाइलों से यह सब ठीक से कॉपी और पेस्ट किया है! उम्मीद है कि यह आपके लिए काम करता है।

+0

बहुत बहुत धन्यवाद आदमी, आप चट्टान! – Iain

+0

@ मैट डब्ल्यू, $ प्रतीक क्यों हैं? – Simsons

+0

@ सुबेन बस एक पुराना कोड शैली सम्मेलन है जो मैं स्थानीय और आवृत्ति चर से फ़ंक्शन पैरामीटर को इंगित करने के लिए उपयोग करता था। –

2

मुझे लगता है कि इवेंटडिस्पर वर्ग का उपयोग करने का सबसे अच्छा अभ्यास होगा जहां कभी भी सकारात्मक हो। आप इसके बारे में यहां पढ़ सकते हैं: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00002325.html

UI घटकों में भी बहुत AS3-जैसी ईवेंट प्रेषण है।

0

मैंने एएस 2 में घटनाओं से निपटने के लिए कुछ कक्षाएं लिखीं। आप उन्हें यहां डाउनलोड कर सकते हैं।

http://dispatchevent.org/mims/as2-eventdispatcher/

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