0

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

我的问题是在警报窗口 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。

4

2 回答 2

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>
于 2012-12-17T20:42:10.520 回答
0

您是否在调用处理程序之前执行选择?

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

您的 validateNow 强制提交。但是,它将在以后发生,而无需手动执行。

于 2012-12-18T13:42:31.513 回答