0

ArrayCollection dataProvider のリストがあります。私のプログラムには、ユーザーがクリックして List の selectedIndex の機能を実行できるボタンがありますが、アクションを実行するかどうかを確認するアラートが最初に表示されます。ユーザーがアラートに回答すると、リストの 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 に答える