Как я могу повторно использовать одну функцию для нескольких компонентов? - PullRequest
0 голосов
/ 20 августа 2011

Я создал пользовательский компонент, который более удобно использовать в качестве SkinnablePopUpContainer, и я хочу использовать ту же функцию, которая вызывает и получает от нее данные для нескольких кнопок в пользовательском интерфейсе.Каков наилучший способ достичь этого, не создавая новую функцию для каждой кнопки?

<fx:Script>
        <![CDATA[
            import spark.events.PopUpEvent;

            protected function button1_clickHandler(event:MouseEvent):void
            {

                popup.addEventListener(PopUpEvent.CLOSE, onPopUpEventClose1, false, 0, true);
                popup.open(this);

            }

            private function onPopUpEventClose1(event:PopUpEvent):void {
                popup.removeEventListener(PopUpEvent.CLOSE, onPopUpEventClose1);
                trace(event.commit);
                trace(event.data);
                button1.label=event.data;
            }

            protected function button2_clickHandler(event:MouseEvent):void
            {

                popup.addEventListener(PopUpEvent.CLOSE, onPopUpEventClose2, false, 0, true);
                popup.open(this);

            }

            private function onPopUpEventClose2(event:PopUpEvent):void {
                popup.removeEventListener(PopUpEvent.CLOSE, onPopUpEventClose2);
                trace(event.commit);
                trace(event.data);
                button2.label=event.data;
            }


        ]]>
    </fx:Script>

    <s:Button id="button1" x="102" y="103" label="Button 1 Numbers"
              click="button1_clickHandler(event)"/>
    <s:Button id="button2" x="102" y="200" label="Button 2 Numbers"
              click="button2_clickHandler(event)"/>

Вы можете видеть, как я предпочел бы иметь один набор функций, который может обрабатывать все это, а не кодировать каждую функцию вручную.

Есть ли способ получить идентификатор компонента, который вызывает функцию?Какой лучший способ решить это?

РЕДАКТИРОВАТЬ: РЕШЕНИЕ

Мне удалось заменить весь этот код на триммер следующим образом:

            private var buttonPick:Button;


        public function button_clickHandler(button:Button):void
        {
            switch (button) {
                case button1: popup.addEventListener(PopUpEvent.CLOSE, onPopUpEventClose, false, 0, true);
                    popup.open(button);
                 break;
                case button2: popup.addEventListener(PopUpEvent.CLOSE, onPopUpEventClose, false, 0, true);
                    popup.open(button); break;

            }
            buttonPick = button;

        }

        private function onPopUpEventClose(event:PopUpEvent):void {
            popup.removeEventListener(PopUpEvent.CLOSE, onPopUpEventClose);
            trace(event.commit);
            trace(event.data);

            buttonPick.label=event.data;
        }

и это как mxml:

<s:HGroup click="button_clickHandler(event.target as Button)">


<s:Button id="button1" x="102" y="103" label="Button 1 Numbers"
          />
<s:Button id="button2" x="102" y="200" label="Button 2 Numbers"
          />
</s:HGroup>

Спасибо за вклад и советы!И если есть более эффективный способ сделать это, чем в случае с кейсами, обязательно предложите это!

Ответы [ 2 ]

1 голос
/ 21 августа 2011

Вы должны поместить эти кнопки в общий контейнер и прослушивать щелчки в этом контейнере. Затем вы можете использовать Event # target, чтобы определить, по какому элементу в контейнере была нажата кнопка.

Ваши кнопки в общем контейнере:

<s:Group click="button_clickHandler(event.target as Button)">
    <s:Button id="button1" x="102" y="103" label="Button 1 Numbers" />
    <s:Button id="button2" x="102" y="200" label="Button 2 Numbers" />
</s:Group>

Обработчик события:

protected function button_clickHandler(button:Button):void {
    switch (button) {
        case button1: trace('clicked button 1'); break;
        case button2: trace('clicked button 2'); break;
        default: trace('clicked somewhere else in the group'); break;
    }
}

Как вы можете видеть, я приводил event.target к классу Button с помощью ключевого слова as. Таким образом, если вы нажмете на что-то еще, кроме кнопки, аргумент 'button' будет 'null'.

1 голос
/ 20 августа 2011

Считайте документы для Event.target и Event.currentTarget.В этом случае вы хотите использовать currentTarget. Эта статья описывает различия между target и currentTarget.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...