Создание прослушивателей событий, которые вызывают одну и ту же функцию и передают переменную - PullRequest
1 голос
/ 21 февраля 2012

Я полностью испортил свой код и не изменил имена мувиклипа при копировании в StackOverflow, так что это не имело смысла.

Мне интересно, есть ли лучший способ выполнить следующее as3:

//THREE EVENT LISTENERS

                shoe_icon.addEventListener(MouseEvent.MOUSE_DOWN, shoeApp);
                top_icon.addEventListener(MouseEvent.MOUSE_DOWN, topApp);
                bottom_icon.addEventListener(MouseEvent.MOUSE_DOWN, bottomApp);

//THREE FUNCTIONS THAT ALL CALL THE SAME FUNCTION BUT PASS A DIFFERENT VALUE
        function shoeApp(event:MouseEvent):void{
            buildSlider("Shoe");
        }
        function topApp(event:MouseEvent):void{
            buildSlider("Top");
        }
        function bottomApp(event:MouseEvent):void{
            buildSlider("Bottom");
        }
//THIS IS MY MAIN FUNCTION WHICH IS ALL BASED ON THE SLIDERTYPE VARIABLE IT RECEIVES 
        function buildSlider(sliderType:String):void{

        }

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Не уверен, что вы хотите сделать здесь. Поскольку слушатель добавляет всех слушателей в сцену вау на MOUSE_DOWN, вы все равно вызовете все 3 функции. На данный момент вы можете справиться с этим с помощью одной функции, которая будет вызывать buildSlider 3 раза с разными параметрами.

Может быть, вы хотите справиться с этим, зависит от того, что вы MOUSE_DOWN? В этом случае вы должны добавить слушателей к различным объектам вместо сцены.

0 голосов
/ 21 февраля 2012

Мне кажется, что вы пытаетесь создать связь между MovieClip и значением String;Dictionary может помочь вам в этом.

private var buttonClipsToActionsMap: Dictionary = new Dictionary();

public function init() : void {
    buttonClipsToActionsMap[buttonShoe] = "Shoe";
    buttonClipsToActionsMap[topApp] = "Top";

    // Bind the Event Listener to the Stage.
    stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownEvent);
}

private function onMouseDownEvent(event : MouseEvent) : void {
    // Check to see if the MovieClip clicked is assosated with an Action.
    var action : String = buttonClipsToActionsMap[event.currentTarget];

    // If it does then invoke buildSlider().
    if (action != null) {
        buildSlider(action);
    }
}

Обратите внимание, что вам нужен только один прослушиватель событий, добавленный в сцену, а не 3 отдельных в каждом мувиклипе из-за Event Bubbling .

Мы используем словарь в качестве карты или HashTable ;DataStructure, которая допускает простое соотношение 1-1 между двумя значениями.

0 голосов
/ 21 февраля 2012

То, что вы должны иметь, это

//THREE EVENT LISTENERS

buttonShoe.addEventListener(MouseEvent.MOUSE_UP, handleButtonUp);
buttonTop.addEventListener(MouseEvent.MOUSE_UP, handleButtonUp);
buttonBottom.addEventListener(MouseEvent.MOUSE_UP, handleButtonUp);

//THREE FUNCTIONS THAT ALL CALL THE SAME FUNCTION BUT PASS A DIFFERENT VALUE
function handleButtonUp(event:MouseEvent):void
{
    var argument:String = "";

    switch(event.target)
    {
        case buttonShoe:
        {
            argument = "Shoe";
            break;
        }
        case buttonTop:
        {
            argument = "Top";
            break;
        }
        case buttonBottom:
        {
            argument = "Bottom";
            break;
        }
        default:
        {
            trace("something bad happened, we should handle this somehow. but later");
            break;
        }
    }
    buildSlider(argument);       
}

//THIS IS MY MAIN FUNCTION WHICH IS ALL BASED ON THE SLIDERTYPE VARIABLE IT RECEIVES 
function buildSlider(sliderType:String):void
{
   // your code
}
0 голосов
/ 21 февраля 2012

Есть ли причина, по которой вы не можете этого сделать?

    stage.addEventListener(MouseEvent.MOUSE_DOWN, addApps);

    function addApps(event:MouseEvent):void{
        buildSlider("Shoe");
        buildSlider("Top");
        buildSlider("Bottom");
    }

//THIS IS MY MAIN FUNCTION WHICH IS ALL BASED ON THE SLIDERTYPE VARIABLE IT RECEIVES 
function buildSlider(sliderType:String):void{

}
...