PDA

Просмотр полной версии : Как понять, кто вызвал событие?


motoroller
14.01.2011, 01:27
Есть собственный cellRender для tileList где есть изображение и добавлены кнопки
В основном файле есть обработчик события:


files.addEventListener(ListEvent.ITEM_CLICK, action);

private function action(event:ListEvent):void {
// хочу понять куда кликнул пользователь просто на картинку или по кнопке ...
}

TanaTiX
14.01.2011, 01:31
event.target в обработчике

motoroller
14.01.2011, 01:51
[object TileList]

Добавлено через 5 минут
если делать так: trace(event.target.name) // все время выводит instance75

Куда бы ты не кликал в ячейке хоть на картинку хоть на кнопку :(

TanaTiX
14.01.2011, 02:22
у объекта события есть 2 интересных свойства - target и currentTarget. Почитайте на досуге.

alatar
14.01.2011, 05:12
TanaTiX, ListEvent отправляется собственно TileList'ом, соответственно и target и currentTarger будут указывать на TileList.

files.addEventListener(ListEvent.ITEM_CLICK, action);

private function action(event:ListEvent):void {
/*
ваш CellRenderer. Вместо Object пропишите ваш тип.
В самом CellRenderer сделайте переменную которая будет сигнализировать, что нажато
*/
var renderer:Object = files.itemToCellRenderer(event.item);
}
Или сделайте свое всплывающее событие от CellRenderer и туда уже пихайте что хотите. Или заведите в данных дополнительное поле в которое записывайте, что нажато. Тогда в обработчике достаточно будет проверить это поле у event.item.

motoroller
14.01.2011, 05:18
Вы думаете я стал бы писать сюда не попробовав
trace(event.Currenttarget.name)

Добавлено через 5 минут
TanaTiX, ListEvent отправляется собственно TileList'ом, соответственно и target и currentTarger будут указывать на TileList.

files.addEventListener(ListEvent.ITEM_CLICK, action);

private function action(event:ListEvent):void {
/*
ваш CellRenderer. Вместо Object пропишите ваш тип.
В самом CellRenderer сделайте переменную которая будет сигнализировать, что нажато
*/
var renderer:Object = files.itemToCellRenderer(event.item);
}
Или сделайте свое всплывающее событие от CellRenderer и туда уже пихайте что хотите. Или заведите в данных дополнительное поле в которое записывайте, что нажато. Тогда в обработчике достаточно будет проверить это поле у event.item.


// cellRender
// события для меню
b_delete.addEventListener (MouseEvent.CLICK, deleteFile);

private function deleteFile(event:MouseEvent):void {
data.data.action = "delete";
}

//mainScript

files.addEventListener(ListEvent.ITEM_CLICK, action);
private function action(event:ListEvent):void {
var action:String=event.item.data.action;

if(action=='delete') {
trace('работает')
}


Данная конструкция работает, но есть минус, что она запоминает прошлое действие, допустим было: удалить файл, но я его не удалил и в дальнейшем по нажатию на эту ячейку вызывается фунция удаления тк data.data.action = "delete", ну соотвественно пока не выбрано какое-либо другое действие с этой ячейкой

Скажи я что-то неверно делаю в принципе или эту схему можно как-то изменить?

TanaTiX
14.01.2011, 05:27
Извиняюсь, я подумал, что речь идет об экземпляре класса. В 1м посте cellRender с маленькой буквы, вот и обознался, думаю уже в зависимости от регистра...

alatar
14.01.2011, 05:33
или эту схему можно как-то изменить?
подписаться на MouseEvent.CLICK у картинки и у самого CellRenderer. Можно использовать один обработчик:
private function deleteFile(event:MouseEvent):void {
if (event.currentTarget == b_delete)
{
data.data.action = "delete";
{
else
{
data.data.action = "none";
}
}

Добавлено через 1 минуту
Хотя при таком раскладе у картинки можно и не подписываться, а просто отрубить ей мышь.

motoroller
14.01.2011, 05:55
так попробую, а вообще это плохо или нет что повешано можно сказать два обработчика
из главного класса и cellrendera ?
Не будет ли что-либо дублироваться...
Так а если у меня еще не одна кнопка а много ...

alatar
14.01.2011, 06:01
так попробую, а вообще это плохо или нет что повешано можно сказать два обработчика
В принципе, можно обойтись и одним, если повесить его на CellRenderer и проверять event.target == b_delete.
Так а если у меня еще не одна кнопка а много ...
Волшебных палочек не существует. Есть кнопка, значит кто-то должен ее обработать.

motoroller
14.01.2011, 06:04
А еще вопро а собственно функцию надо вешать на какое событие?


... class CustomImageCacheCell
public function CustomImageCacheCell() {
super();
this.addEventListener (MouseEvent.CLICK, actions);
}

Так ошибку выдает

alatar
14.01.2011, 06:07
Какую функцию?

motoroller
14.01.2011, 06:09
Ошибься все ок :)
Всмысле работает по Вашей схеме