Применение прослушивателя событий ко всем экземплярам на стадии элемента и удаление определенного элемента

У меня есть список элементов в прокручивающемся списке, я бы хотел, чтобы пользователь щелкнул конкретный элемент, чтобы удалить его - мне нужно применить 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);
    }
}
Другие вопросы по тегам