Flex 3:当用户单击按钮时,从数组集合中删除项目并将其反映在转发器中

| 我有一个具有以下结构的arrayCollection:
projectErrorsAC
    0
        project1number
        project2number
        position1number
        position2number
        project1name
        project2name
        student
    1
        ...
AC定义如下:
[Bindable] private var projectErrorsAC:ArrayCollection = new ArrayCollection;
我正在中继器中使用此交流电来显示每个错误。显示每个错误后,我放置了一个“接受”和“拒绝”按钮。用户单击这些按钮中的任何一个后,我想调用一个函数,该函数可以消除交流电中的特定错误。这是我到目前为止的内容: 中继器:
<mx:Repeater id=\"projRP\" width=\"100%\" dataProvider=\"{projectErrorsAC}\">
<mx:HBox>
    <mx:Text id=\"projmsg\" text=\"{projRP.currentItem.student} is working on the following projects on the same day: {projRP.currentItem.proj1name} and {projRP.currentItem.proj2name}.\" />
    <mx:Text id=\"allow\" text=\"Allow\" color=\"#ff0000\" selectable=\"false\" 
        click=\"acceptProjConflict(projRP.currentItem);\" 
        mouseOver=\"parentApplication.switchCursor(true);\" 
        mouseOut=\"parentApplication.switchCursor(false);\" />
    <mx:Text text=\" |\" />
    <mx:Text id=\"decline\" text=\"Decline\" color=\"#ff0000\" selectable=\"false\" click=\"declineProjConflict(projRP.currentItem);\" mouseOver=\"parentApplication.switchCursor(true);\" mouseOut=\"parentApplication.switchCursor(false);\" />
</mx:HBox>
</mx:Repeater>
这是我在“点击”部分中调用的函数:
public function acceptProjConflict(conflict:Object):void
{
for (var i:int = 0; i < projectErrorsAC.length; i++)
{
    if (projectErrorsAC.getItemAt(i) == conflict)
        projectErrorsAC.removeItemAt(i);
}               
}
由于某种原因,这是行不通的... *编辑* 成功! 我必须创建一个模块放入中继器内-中继器现在如下所示:
<mx:Repeater id=\"projRP\" width=\"100%\" dataProvider=\"{projectErrorsAC}\">
    <conflict:showErrors id=\"projErrors\" thisObject=\"{projRP.currentItem}\" isProject=\"true\"/>
</mx:Repeater>
我的模块如下所示:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<mx:Module xmlns:mx=\"http://www.adobe.com/2006/mxml\" layout=\"absolute\" creationComplete=\"init();\">
        <mx:Script>
            <![CDATA[
                public var isProject:Boolean;
                public var thisObject:Object;
                [Bindable] public var displayString:String = new String;

                private function init():void
                {
                    if (isProject)
                    {
                        displayString = thisObject.student + \" is working on the following projects on the same day: \" + thisObject.proj1name + \" and \" + thisObject.proj2name + \".\";
                    }
                }
            ]]>
        </mx:Script>

    <mx:Canvas width=\"750\">
        <mx:HBox>
            <mx:Text id=\"projmsg\" text=\"{displayString}\" />
            <mx:Text id=\"allow\" text=\"Allow\" color=\"#ff0000\" selectable=\"false\" click=\"parentDocument.acceptProjConflict(thisObject)\" mouseOver=\"parentApplication.switchCursor(true);\" mouseOut=\"parentApplication.switchCursor(false);\" />
            <mx:Text text=\" |\" />
            <mx:Text id=\"decline\" text=\"Decline\" color=\"#ff0000\" selectable=\"false\" click=\"parentDocument.declineProjConflict(thisObject);\" mouseOver=\"parentApplication.switchCursor(true);\" mouseOut=\"parentApplication.switchCursor(false);\" />
        </mx:HBox>
    </mx:Canvas>
</mx:Module>
    
已邀请:
这可能是引起ArrayCollection的特定问题,因为您可能试图删除不再位于您认为可能位于索引处的对象,这可能会发生。 我相信这类问题正是Java建议使用集合迭代器的原因。 这里进一步解释 此外,我建议您将List与itemRenderer而不是转发器一起使用。中继器以其引起内存泄漏的能力而闻名,并且没有像itemRenderers的List那样优化。 干杯     
首先,您是否尝试过调试? 其次,我对单击处理程序的工作感到惊讶,因为Repeater存在奇怪的作用域问题(通常无声地失败),这就是为什么我说您应该尝试调试的原因。 第三,您的点击处理程序效率低下,您应该执行以下操作:
public function acceptProjConflict(conflict:Object):void
{
   for(var i:uint, len:uint = projectErrorsAC.length; i<len; i++)
   {
       if(projectErrorsAC.source[i] == conflict)
       {
           projectErrorsAC.removeItemAt(i);
           break;
       }
   }         
}
但是,是的,可以肯定地确定您的问题在于从未调用过您的处理程序。     
你可能会用
[Bindable] private var projectErrorsAC:ArrayCollection = []; 
代替
[Bindable] private var projectErrorsAC:ArrayCollection = new ArrayCollection;
拥有大量数据时,它将更快。     

要回复问题请先登录注册