从数组中删除项目

时间:2010-12-14 03:01:06

标签: flex actionscript-3

我有2个数组& 2个复选框转发器:第二个转发器将填充w /从第一个选择的项目。我可以添加项目没问题。如果从第一个复选框转发器中取消选择该项,我该如何删除它?

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        creationComplete="updateOlder();"
         >
<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        public var older:ArrayCollection  = new ArrayCollection ([]);

        [Bindable]
        public var newer:ArrayCollection  = new ArrayCollection ([]);

        private function updateOlder():void{
            older.addItem({label:"item1",desc:"desc1"});
            older.addItem({label:"item2",desc:"desc2"});
            older.addItem({label:"item3",desc:"desc3"});
        }

        private function updateNewer(evt:MouseEvent):void{
            if(evt.target.selected) {
                // add item to array    
                newer.addItem({ label:evt.currentTarget.label,     desc:evt.currentTarget.data });
                newer.refresh();
            } 
            else {
                // remove item from array
                newer.removeItemAt( newRepeater.currentIndex.valueOf() );
                newer.refresh();

            }
        }
    ]]>
</fx:Script>

<mx:HBox width="100%" height="100%">
<mx:VBox width="100%" height="100%">
    <mx:Repeater id="oldRepeater" dataProvider="{older}">
        <mx:CheckBox color="black" fontFamily="Arial" fontSize="14"
                     label="{oldRepeater.currentItem.label}" 
                     data="{oldRepeater.currentItem.desc}" 
                     click="updateNewer(event);"
                     />
    </mx:Repeater>
</mx:VBox> 
    <mx:VBox width="100%" height="100%">
    <mx:Repeater id="newRepeater" dataProvider="{newer}">
        <mx:CheckBox color="red" fontFamily="Arial" fontSize="14"
                     label="{newRepeater.currentItem.label}"
                     data="{newRepeater.currentItem.desc}" 
                     />
    </mx:Repeater>
</mx:VBox> 
</mx:HBox>


</mx:Application>

1 个答案:

答案 0 :(得分:1)

仅当Repeater迭代其'dataProvider时,

Repeater.currentIndex property才为-1。 这是你的代码工作:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        creationComplete="updateOlder();"
         >
<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import flash.events.MouseEvent;
        import mx.controls.CheckBox;
        import mx.core.Repeater;
        [Bindable]
        public var older:ArrayCollection  = new ArrayCollection ([]);
        [Bindable]
        public var newer:ArrayCollection  = new ArrayCollection ([]);

        private function updateOlder():void{
            older.addItem({key:'item1',val:'desc1'});
            older.addItem({key:'item2',val:'desc2'});
            older.addItem({key:'item3',val:'desc3'});
        }

        private function updateNewer(evt:MouseEvent):void {
            var tmpBox:CheckBox = evt.target as CheckBox;
            if(tmpBox.selected) {
                // add item to array   
                newer.addItem({key:tmpBox.label,val:tmpBox.data});
            } 
            else {
                // remove item from array
                var newArrIndex: int = getArrayElementIndex(newer, older[tmpBox.instanceIndex]);
                if(newArrIndex != -1){
                    newer.removeItemAt(newArrIndex);
                }
            }
            newer.refresh();
        }

        private function getArrayElementIndex(arr:ArrayCollection, elementValue:Object):int{
            for (var retInd: int = 0; retInd < arr.length; retInd++) {
                if (arr[retInd]['key'] == elementValue['key'] && arr[retInd]['val'] == elementValue['val']) {
                    return retInd;
                }
            }
            return -1;
        }       
    ]]>
</fx:Script>

<mx:HBox width="100%" height="100%">
<mx:VBox width="100%" height="100%">
    <mx:Repeater id="oldRepeater" dataProvider="{older}">
        <mx:CheckBox color="black" fontFamily="Arial" fontSize="14"
                     label="{oldRepeater.currentItem['key']}" 
                     data="{oldRepeater.currentItem['val']}" 
                     click="updateNewer(event);"
                     />
    </mx:Repeater>
</mx:VBox> 
    <mx:VBox width="100%" height="100%">
    <mx:Repeater id="newRepeater" dataProvider="{newer}">
        <mx:CheckBox color="red" fontFamily="Arial" fontSize="14"
                     label="{newRepeater.currentItem['key']}"
                     data="{newRepeater.currentItem['val']}" 
                     />
    </mx:Repeater>
</mx:VBox> 
</mx:HBox>
</mx:Application>