PDA

Просмотр полной версии : Пользовательские события. Передача параметра.


Srednas
22.02.2012, 12:58
Здравствуйте.

Нужно по клику по объекту должно срабатывать событие и передавать id объекта.
Подскажите как это можно сделать? Если есть на примете ссылочка с примером, еще лучше )

-De-
22.02.2012, 13:14
http://www.flasher.ru/forum/blog.php?b=239
Мне больше всего нравится вариант - завести поле id у обьекта и выдрать его как event.currentTarget.id

HardCoder
22.02.2012, 13:19
Событие:package {
import flash.events.Event;

/**
* ...
* @author HardCoder
*/
public final class SomeEvent extends Event {
public static const DO_SOMETHING:String = "doSomething";

private var _property_1:uint;
private var _property_2:Boolean;

public function SomeEvent(type:String, property_1:uint, property_2:Boolean, bubbles:Boolean = false, cancelable:Boolean = false){
super(type, bubbles, cancelable);

this._property_1 = property_1;
this._property_2 = property_2;
}

override public function clone():Event {
return new SomeEvent(this.type, this._property_1, this._property_2, this.bubbles, this.cancelable);
}

override public function toString():String {
return formatToString("SomeEvent", "property_1", "property_2", "type", "bubbles", "cancelable", "eventPhase");
}

public function get property_1():uint {
return this._property_1;
}

public function get property_2():Boolean {
return this._property_2;
}
}
}
Прослушивание:myObject.addEventListener(SomeEvent.DO_SOMETHING, myObjectHandler);

private function myObjectHandler(e:SomeEvent):void{
trace(e.property_1, e.property_2);
}

Диспетчеризация:private function onClick(e:Event):void {
this.dispatchEvent(new SomeEvent(SomeEvent.DO_SOMETHING, 1203, true));
}

-De-
22.02.2012, 13:46
HardCoder, а как ты в onClick узнаешь нужный id?

cleptoman
22.02.2012, 13:52
ну, внутри себя свой айди не так сложно найти )

HardCoder
22.02.2012, 13:59
Забудь про onClick. Этот код я просто скопировал из своих старых примеров. Даже не подумал, что в контексте этой темы он будет играть какую-то роль. Хотел, чтобы топикстартер обратил внимание именно на эту строчку:this.dispatchEvent(new SomeEvent(SomeEvent.DO_SOMETHING, 1203, true));Даже, если на то пошло - по поводу id обьекта по которому кликнули:private function onClick(e:MouseEvent):void {
this.dispatchEvent(new SomeEvent(SomeEvent.DO_SOMETHING, (e.target as MyClass).id));
}

Добавлено через 2 минуты
Теперь можно вешать слушатель SomeEvent.DO_SOMETHING на владельца "кликабельного" обьекта и получать айди нужного обьекта. Ведь, как я понял, именно это нужно в данном случае...

Добавлено через 14 минут
Даже, если "кликабельный" обьект САМ должен отправлять событие, то тогда еще проще:private function onClick(e:MouseEvent):void {
this.dispatchEvent(new SomeEvent(SomeEvent.DO_SOMETHING, this.id));
}Хотя, такие вещи я обычно не использую, так как в прослушивателе можно получить нужное свойство через e.target, как написал выше.

-De-
22.02.2012, 14:21
Т.е. ради someEvent.property_1 вместо e.target.id такой огород городить?

HardCoder
22.02.2012, 14:29
Повторюсь:Хотя, такие вещи я обычно не использую, так как в прослушивателе можно получить нужное свойство через e.target, как написал выше.Это значит, что слушая клик по обьекту в обработчике я получаю его id через e.target.
В другом случае: контроллер получает событие от вьюшки: по каком из ее обьектов кликнули. Зачем вьюшку засорять разными паблик selectedId, someClickedValue или wasOrNoAbraKadabraClicked, которые нужны лишь для того чтобы контроллер их мог по разу дернуть, получив какое-то событие. Вьюшка отправляет пользовательское событие с нужными мне параметрами.

Добавлено через 2 минуты
Со слов автораНужно по клику по объекту должно срабатывать событие и передавать id объекта., я понял, что он не хочет дергать айди через целевой обьект события, по каким-то причинам(как например в случае с вьшкой)