我有一个包含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。
答案 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强制提交。但是,它将在稍后发生,而不会手动强制执行。