私が達成しようとしている提案されたUXはこれです:
- ユーザーがメニュー項目をクリックします(listBaseサブクラスを介して:例:ButtonBarまたはTabBar)
- 初期選択を防ぐ
- ユーザーが問題に対処する必要があるかどうかを検証します(たとえば、フォームに保存されていないデータなど)
- 有効な場合は、選択を行い、listBaseをそのselectedIndexに設定します。そうでない場合は、ユーザーに警告を表示し、選択プロセスを完全にキャンセルします。
これは期待どおりに機能しません。IndexChangeEvent.CHANGINGタイプとpreventDefaultを利用すると、選択が強制終了されますが、ステップ4で、listBaseのselectedIndexをプログラムで設定すると、CHANGINGイベントが再ディスパッチされます(これは、APIドキュメントの主張にかかわらず)。
これを自分で試してみたい場合は、サンプルのアプリケーションsrcコードを次に示します。コメントと解決策を楽しみにしています。
ありがとう。J
<?xml version="1.0" encoding="utf-8"?>
<s:Application minWidth="955" minHeight="600"
xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script>
<![CDATA[
import flash.utils.setTimeout;
import mx.core.mx_internal;
import spark.events.IndexChangeEvent;
use namespace mx_internal;
[Bindable]
private var doPreventDefault:Boolean;
[Bindable]
private var delayMS:uint = 500;
private function buttonbar_changingHandler( event:IndexChangeEvent ):void
{
// TODO Auto-generated method stub
if ( doPreventDefault )
{
event.preventDefault();
setTimeout( delayedLogic, delayMS, event.newIndex );
}
}
private function delayedLogic( index:int ):void
{
//disabling this results in an endless loop of trying to set the selected index
// doPreventDefault = false;
//this should NOT be hitting the changing handler since we're supposed to be dispatching a value commit event instead.
bb.setSelectedIndex( index, false );
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout horizontalAlign="center"/>
</s:layout>
<s:ButtonBar id="bb"
changing="buttonbar_changingHandler(event)">
<s:dataProvider>
<s:ArrayList>
<fx:String>btn 0</fx:String>
<fx:String>btn 1</fx:String>
<fx:String>btn 2</fx:String>
</s:ArrayList>
</s:dataProvider>
</s:ButtonBar>
<s:CheckBox label="preventDefault?"
selected="@{ doPreventDefault }"/>
<s:NumericStepper maximum="5000" minimum="500"
stepSize="500" value="@{ delayMS }"/>
</s:Application>