Flex:SparkでのDefaultのDefault:ListBaseが働いていません
-
13-12-2019 - |
質問
私が達成しようとしている提案されているUXはこれです:
- ユーザーはメニュー項目をクリックします(ListBaseサブクラスを介して:e.ButtorBarまたはTabbar)
- 初期選択を防ぐ
- ユーザーが問題を解決する必要があるかどうかを検証します(例えば、フォーム上の未保存のデータなど)
- 有効な場合は選択してListBaseをそのSelectedIndexに設定してください。それ以外の場合は、ユーザーに警告を表示し、選択プロセスを完全にキャンセルします。
あなたが期待するようには機能しません。 IndexChangeEvent.Changing TypeとPurnterDefaultは選択を強制終了しますが、ステップ4では、プログラムでListBaseのSelectedIndexを設定している場合は、変更されたイベント(これはAPI Docsクレーム)を再スパッチしようとします。< / P>
これはあなた自身のためにこれを試してみたい場合は、サンプルアプリケーション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>
.解決
SDKを見て、IndexChangeEvent.CHANGING
イベントは実際には予防できません - ドキュメントここはキャンセル可能であると言っています、それで私の悪いですが(asdocは少し横になったが)、ここから少し面白くなることがあります。
ListBase @ 1296これはcommitSelection(dispatchEvents:Boolean = true)
メソッドからのみ送出されるだけです。 ButtonBarBase:dataProvider_changeHandler()
では、イベントをディスパッチしないことを明確に呼び出す唯一の場所ですが、ProposedSelectionIndexがある場合はListBase
@ 939で呼び出されます。
SO上記のコードから、選択を設定しようとしている場合 - これはコミット選択を呼び出すことになります。これは私がコールスタックの問題を引き起こしていると思います。 500msでは500msで少なくとも1回は無効化サイクルを経験しているため、一般的にcommitProperties
@からCOMMITSETAGCODEフラグがセットされているため、UIがNITESELECTIONが再度実行されますので、問題を悪化させるだけです。 729
だからこれを修正する方法。
検証に失敗した場合は、以外の場合は正常に進めることを許可します。失敗した場合は、予防を呼び出して、invalidateProperties
を設定したり、同等のものを設定したり、選択を変更しようとしないでください。
[編集] Riastarのコメントを読んで、私は同じ「ソリューション」と同意したばかりです。