У меня вопрос относительно слушателей as3 и экземпляров класса.
Основной вопрос: есть ли способ отправить событие из экземпляра кнопки таким образом, чтобы другие экземпляры кнопки могли прослушивать (без необходимости прослушивателя в классе документа)
Допустим, у меня есть класс документа и класс кнопки. В документе будет несколько экземпляров класса кнопки, добавленных в список отображения. Когда кнопка выбрана, вызывается метод set для установки переменной пакета выбранного для этого экземпляра. Именно отсюда я хотел бы отправить событие, чтобы уведомить все остальные экземпляры.
|document
|-button instance 1
|-button instance 2
|-button instance 3 (i want to send an event directly to instance 1 and 2...)
Мое текущее решение состояло в том, чтобы создать класс buttonGroup, который бы создавал экземпляры кнопок, и кнопки отправляли бы вызов события родительскому элементу группы.
|document
|-button group (catch the event and send an event to all instances within the group)
|---button instance 1
|---button instance 2
|---button instance 3 (dispatch the event)
Но моя проблема осталась - если бы у меня было несколько групп, и я хотел отправить событие всем экземплярам группы ... тогда мне понадобился бы класс buttonManager для отслеживания групп (или, по крайней мере, так я понимаешь?)
|document
|-button manager (catch the event and send an event to all group instances)
|
|---button group 1
|-----button instance 1
|-----button instance 2
|-----button instance 3 (dispatch the event)
|
|---button group 2
|-----button instance 1
|-----button instance 2
|-----button instance 3 (dispatch the event)
Я не против этих "решений", мне просто любопытно, есть ли другой путь, или если на самом деле мои решения являются хорошей практикой. Основа для моего кода находится ниже (за исключением диспетчера кнопок и групповых классов)
Надеюсь, это было достаточно наглядно, и будьте осторожны, я новичок в ООП ...
Заранее спасибо.
document.as
import flash.display.*;
import flash.events.*;
import myClasses.events.ButtonEvent;
public class Document extends MovieClip {
public function Document(){
trace("initialising Document...");
addEventListener(Event.ADDED_TO_STAGE, popStageVars);
}
private function popStageVars(e:Event){
trace("popping stage vars...")
var ob1:AbstractOBJ = new AbstractOBJ
var ob2:AbstractOBJ = new AbstractOBJ
var ob3:AbstractOBJ = new AbstractOBJ
addChild(ob1)
addChild(ob2)
addChild(ob3)
ob1.selected = ob1
ob2.selected = ob2
ob3.selected = ob3
}
}
Класс кнопок:
import flash.display.*;
import flash.events.*;
import myClasses.events.ButtonEvent;
public class ButtonOBJ extends MovieClip implements IEventDispatcher {
internal static var _selected:Object = null
public function ButtonOBJ(){
trace("initialising ButtonOBJ...");
addEventListener(Event.ADDED_TO_STAGE, popStageVars);
addEventListener(AbstractEvent.SET_CUR, checkClip);
}
private function popStageVars(e:Event){
trace("popping stage vars..." + this.name)
}
private function checkClip(e:AbstractEvent){
trace("checking button registered... " + this.name)
}
public function get selected():Object{
return _selected
}
public function set selected(s:Object):void{
var sName:String
if(selected != null){
sName = selected.name
}else{
sName = null
}
trace(this.name + " is changing the current selected from: " + sName + " - to: " + s.name)
_selected = s
dispatchEvent(new AbstractEvent(AbstractEvent.SET_CUR, true));
}
}
, а также кнопка Event:
package myClasses.events{
import flash.events.Event;
public class ButtonEvent extends Event {
public static const SET_CUR:String = "setSelected";
public static const VERSION:Number = 1.0;
public function ButtonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) {
super(type, bubbles, cancelable);
}
public override function clone():Event {
return new ButtonEvent(this.type, this.bubbles, this.cancelable);
}
}
}