отправить dispatchEvent ребенку: пример не работает?(вспышка, as3) - PullRequest
0 голосов
/ 15 октября 2011

Я хотел бы отправить dispatchEvent на загруженный SWF, положить в movieclip.Я нашел хорошую тему по этому поводу , но мой пример не работает, "след" не появляется.

Редактировать.

  • У меня есть main.as
  • другой класс: submenu.as, который я импортирую в main.as
  • , когда я нажимаю на "главное" меню в main.as, яЯ хотел бы отправить dispatchEvent на submenu.as (потому что я бы хотел, чтобы подменю изменило один из его пунктов, когда я нажимаю на "главное меню" в main.as, поэтому мне нужно отправить dispatchEventна submenu.as)
  • , поэтому я поставил dispatchEvent в методе clickButton в моем main.as: Event.CHANGE
  • и в submenu.as, я хотел быпослушать это event.CHANGE, и вот что я написал ниже

Конец редактирования.

В моем родительском классе: каждый раз, когда я нажимаю наменю:

dispatchEvent(new Event(Event.CHANGE));

или

stage.dispatchEvent(new Event(Event.CHANGE));

и в классе моего ребенка:

public function initStage (e:Event){
[…]
this.parent.addEventListener(Event.CHANGE, switchItem, false, 0, true);

private function switchItem(pEvent:Event):void
{
    trace("PARENT_CHANGED");
}   

Есть идеи?

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Насколько я могу судить, эта тема не слишком применима к вам, если вы на самом деле не загружаете SWF во время выполнения и не пытаетесь прослушивать события между ними. Я бы также посоветовал не использовать иерархию в списке отображения для сбора ссылок, если только сама иерархия действительно не важна. Например, может быть, это меню удаляет себя из родительского контейнера при закрытии или ему нужно добавить displayObject в тот же контейнер, в котором он включен, и ему все равно, что это за контейнер. Использование иерархии вынуждает вас поддерживать эту иерархию для ссылок, что иногда может затруднить внесение изменений в растущем приложении. Вот пример того, что вы можете искать, который не использует список отображения для сбора ссылок:

public class Main extends Sprite 
{
    private var menu:SubMenu;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        menu = new SubMenu(this);
        addChild(menu)  //This is not neccessary for them to communicate
        dispatchEvent(new Event(Event.CHANGE));
    }

}

public class SubMenu extends Sprite
{
    private var mainMenu:IEventDispatcher;  //This could be typed as Main instead of IEventDispatcher if needed. 
                                            //Sprites are however IEventDispatchers

    public function SubMenu(mainMenu:IEventDispatcher) 
    {
        this.mainMenu = mainMenu;
        mainMenu.addEventListener(Event.CHANGE, switchItem, false, 0, true);
    }

    private function switchItem(event:Event):void
    {
        trace("Parent_Changed")
    }
}

Вот пример использования иерархии списка отображения (я бы не советовал):

public class Main extends Sprite 
{
    private var menu:SubMenu;

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        menu = new SubMenu();
        addChild(menu)  //This is neccessary, and the menu cannot be added to a different parent

        dispatchEvent(new Event(Event.CHANGE));

    }
}
public class SubMenu extends Sprite
{

    public function SubMenu() 
    {
        //Neccessary because submenu will not have a parent when its first instantiated.
        //When its on the stage then you can have it grab its parent and add a listener.
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);

    }

    private function init(event:Event = null):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        //Parents available
        parent.addEventListener(Event.CHANGE, switchItem, false, 0, true);
    }

    private function switchItem(event:Event):void
    {
        trace("Parent_Changed")
    }

}
1 голос
/ 17 октября 2011

Я вижу две вероятные возможности.

Сначала попробуйте добавить точку останова или проследить, на что установлена ​​this.parent в вашей функции initStage().Если вы говорите dispatchEvent() или stage.dispatchEvent(), но дочерний элемент фактически добавляется к объекту внутри Main, а не к самому экземпляру Main, тогда он, вероятно, прослушивает неправильный объект для события.

Second, убедитесь, что initStage() действительно выполняется до того, как ваше событие будет запущено.Возможно, что слушатель не настроен во время отправки события.

1 голос
/ 16 октября 2011

Из дочернего SWF, доступ из loaderInfo.

loaderInfo.sharedEvents.addEventListener(Event.CHANGE, switchItem, false, 0, true);

Исходя из ваших правок, кажется, что main.as и submenu.as находятся в одном SWF, и, возможно, проблема в том, что вы пытаетесь всплыть события внизу?

Вы можете отправить событие против дочернего объекта или использовать статический / одноэлементный шаблон, например:

public static var dispatcher:IEventDispatcher = new EventDispatcher();

Отправка событий диспетчеру и прослушивание событий в диспетчере.

Это похоже на то, как вы пытаетесь отправлять события на сцену; однако ребенок должен слушать против сцены, а не «this.parent». Я бы не рекомендовал это.

В противном случае родитель должен передать событие дочернему элементу, как в случае отправки main.as, для дочернего экземпляра, определенного в submenu.as.

...