警报后列表中的selectedIndex

时间:2012-12-17 15:28:40

标签: actionscript-3 flex

我有一个包含ArrayCollection dataProvider的列表。在我的程序中,有一个按钮,用户可以单击该按钮为列表的selectedIndex执行功能,但会首先显示警报,询问他们是否确定要执行操作。用户应答警报后,将对列表的selectedIndex执行操作。

我的问题是,在Alert窗口CloseEvent之后,selectedIndex = -1,即使它被明确选中。我通过在Alert CloseEvent的代码中的列表上执行validateNow()来解决这个问题。

我的问题:为什么我必须这样做,我做错了什么?或者这是正常/最佳做法?此外,有没有更好/最佳的做法来检查列表,看看除了使用try-catch之外是否选择了某些东西。如果没有选择任何内容,我不希望最终用户看到生成的错误。

代码:

//Note: "fl" is a class with "friendsList" bindable ArrayCollection; for the sake of keeping this short I will not include it

private function _removeFriendClick(event:MouseEvent):void
{
    try {
        if (this.friendsList.selectedIndex != -1) {
            Alert.show("Are you sure you want to remove "+this.fl.friendsList[this.friendsList.selectedIndex].label+" as a friend?", "Remove Friend", Alert.YES | Alert.CANCEL, this, this._removeFriendConfirm, null, Alert.CANCEL);
        }
    } catch (e:Error) { }
}

private function _removeFriendConfirm(event:CloseEvent):void
{
    this.friendsList.validateNow();
    trace(this.friendsList.selectedIndex);
}

因此,使用上面的代码,如果取出validateNow(),则抛出异常,因为它认为selectedIndex为-1。

2 个答案:

答案 0 :(得分:1)

我会这样做:

<?xml version="1.0" encoding="utf-8"?>
<s: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" minWidth="955" minHeight="600">

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;
        import mx.events.CloseEvent;

        [Bindable]private var friendsList:ArrayCollection = new ArrayCollection([{data:"111", label:"Don"}, {data:"222", label:"John"}]);

        private function onBtnRemove():void
        {
            laFriend.text = "";

            try 
            {
                if (cbFriends.selectedIndex != -1) 
                {
                    Alert.show("Are you sure you want to remove " + cbFriends.selectedItem.label + " as a friend?", "Remove Friend", Alert.YES | Alert.CANCEL, this, this._removeFriendConfirm, null, Alert.CANCEL);
                }
            } catch (e:Error) { }
        }

        private function _removeFriendConfirm(event:CloseEvent):void
        {
            laFriend.text = "Selected friend: " + cbFriends.selectedItem.label;
        }
    ]]>
</fx:Script>


<mx:VBox>
    <s:ComboBox id="cbFriends" dataProvider="{friendsList}"/>
    <s:Button id="btnRemove" label="Remove" click="onBtnRemove()"/>
    <s:Label id="laFriend" text=""/>
</mx:VBox>

</s:Application>

答案 1 :(得分:0)

您是否在致电处理程序之前执行选择?

如果设置了selectedIndex,则由于生命周期而无法立即将其恢复 - 在您阅读之前应提交值。

您的validateNow强制提交。但是,它将在稍后发生,而不会手动强制执行。