Применение прослушивателя событий ко всем экземплярам на стадии элемента и удаление определенного элемента
У меня есть список элементов в прокручивающемся списке, я бы хотел, чтобы пользователь щелкнул конкретный элемент, чтобы удалить его - мне нужно применить eventListener ко всем экземплярам этого элемента, чтобы любой элемент, по которому щелкнули, был удален
Это первая функция:
private function dataLoaded(event:Event):void {
// this holds the loaded xml data //
data = new XML(event.target.data);
//items properties call - add other calls to master properties later on//
items = data.item;
// parsing of each ingredient//
for (var i = 0; i < items.length(); i++) {
// instantiation of mcItem (the stage for each item)
_item = new Item();
// sets //over// layer to invisible / transparent //
_item.item_btn_over.alpha = 0;
// creates the var itemTextField //
_itemTextField = new TextField();
// _itemTextField visual attributes //
_itemTextField.x = _textFieldXPosition + _textFieldPaddingLeft;
_itemTextField.y = _textFieldYPosition;
_itemTextField.selectable = true;
_itemTextField.wordWrap = true;
_itemTextField.width = _textFieldWidth;
_itemTextField.height = _textFieldHeight;
_itemTextField.embedFonts = true;
_defaultFormat.color = 0x111112;
_defaultFormat.font = _arialRounded.fontName;
_defaultFormat.size = 18;
_itemTextField.defaultTextFormat = _defaultFormat;
_itemTextField.text = items[i].toString();
//adds textfield to displaylist//
_item.addChild(_itemTextField);
//vertical positioning//
_item.y = i * _itemPosition;
_item.buttonMode = true;
_item.mouseChildren = false;
//adds items to container displaylist//
_container.addChild(_item);
}
// Input Mask//
_mask = new Shape();
_mask.graphics.beginFill(0xFF0000);
_mask.graphics.drawRect(0, 0, _maskWidth, _maskHeight);
_mask.graphics.endFill();
// Positioning of input mask//
// horizontal centering of input mask//
_mask.x = stage.stageWidth / 2 - _container.width / 2;
_mask.y = _paddingTop;
// adds the mask onto the stage//
addChild(_mask);
// assigns the above mask to the container //
_container.mask = _mask;
// Positioning of container with the mask//
// horizontal centering of container //
_container.x = stage.stageWidth / 2 - _container.width / 2;
// vertical position of container //
_container.y = _paddingTop;
//Container background stylings//
_background = new Shape();
_background.graphics.beginFill(0xFFFFFF);
_background.graphics.drawRect(0, 0, _container.width, _container.height);
_background.graphics.endFill();
_container.addChildAt(_background, 0);
//End of container background stylings//
_item.parent.addEventListener( MouseEvent.CLICK, itemClicked );
_container.addEventListener(MouseEvent.MOUSE_OVER, movingOver);
_container.addEventListener(MouseEvent.MOUSE_OUT, movingOut);
}
А вот мой itemClicked
функция:
function itemClicked(event:MouseEvent):void {
_item.parent.removeChild(_item);
}
К сожалению, мои предыдущие попытки удалось удалить только последний элемент в списке. Как применить слушателя ко всем экземплярам, но в функции слушателя удалить только тот элемент, на который был нажат?
2 ответа
Ваша проблема в том, что у вас есть, как я предполагаю, переменная члена класса с именем _item, и когда вы проходите цикл, вы повторно используете эту переменную для создания нового элемента. Таким образом, _item - это ссылка на последний созданный вами элемент.
Поэтому, когда вы используете его в itemClickHandler - он ВСЕГДА ссылается на последний созданный вами элемент.
Вот пример того, что вы должны делать:
// this is just example code for your dataLoaded function showing the correct concept
for (var i = 0; i < items.length(); i++)
{
var newItem:Item = new Item;
// do whatever you need to newItem
newItem.addEventListener(MouseEvent.CLICKED, itemClicked);
}
function itemClicked(event:MouseEvent):void
{
var curItem:Item = event.currentTarget as Item;
curItem.parent.removeChild(curItem);
}
Хотя вы могли бы сделать это также:
// this is just example code for your dataLoaded function showing the correct concept
for (var i = 0; i < items.length(); i++)
{
var newItem:Item = new Item;
// do whatever you need to newItem
}
_container.addEventListener(MouseEvent.CLICKED, itemClicked);
function itemClicked(event:MouseEvent):void
{
// you could also have a check here to see if it is indeed an Item
var curItem:Item = event.target as Item;
curItem.parent.removeChild(curItem);
}
Этот второй подход имеет преимущество только 1 слушателя, и поэтому вам нужно будет только удалить 1, когда вы закончите со списком.
Вы можете получить доступ к нажатому элементу в слушателе событий как evt.target.
Пытаться:
function itemClicked(event:MouseEvent):void {
if(evt.target is Item) {
var item:Item = Item(evt.target);
item.parent.removeChild(item);
}
}