[編集] ここでの主な質問は、「Flex はマルチスレッドですか?」と大まかに訳すと、そうではないことがわかったので、操作の途中で不思議なことにデータが変化することはありません。以下のコードは機能しましたが、厄介で混乱を招きました。最終的に、アーキテクチャの変更で問題を修正し、イベントを抑制する必要がなくなりました。最初のコメンターが示唆したように。
イベントをリッスンする方法を変更し、イベント経由ではなく特定のアクションを明示的に実行することで、無限ループを排除しました。
コマンド パターンを使用して、イベントの照合が容易になりました。
基本的に、このページに出くわした場合は、以下のコードを使用しないでください。[/編集]
シンプルで軽量な MVC パターンを使用して、いくつかの Flex アプリケーションを構築しています。モデルはディスパッチャーを拡張またはカプセル化し、更新時にイベントを発生させます。私はFlex 3.5で立ち往生しています。
場合によっては、これらのイベントを抑制して、無限ループを回避したり、複数のアクションを 1 つのイベントにまとめたりしたいことがあります。
不要で紛らわしいコードでモデルを散らかさないソリューションへの私の最初の刺し傷はこれです:
private var _suppressEvents:Boolean = false;
public function suppressEvents(callback:Function):void
{
// In case of error, ensure the suppression is turned off, then re-throw
var err:Error = null;
_suppressEvents = true;
try
{
callback();
}
catch(e:Error)
{
err = e;
}
_suppressEvents = false;
if (err)
{
throw (err);
}
}
public function dispatch(type:String, data:*):void
{
// Suppress if called from a suppress callback.
if (!_suppressEvents)
{
_dispatcher.dispatchEvent(new DataEvent(type, data));
}
}
明らかに、実行したいモデル コードを含む関数で 'suppressEvents' を呼び出します。
私の質問:
1: この手法を使用して、誤ってイベントを失う可能性はありますか?
2: 通話後に誤って抑制状態になってしまわないようにするために、他のエラー エッジ ケースについて考える必要がありますか?
3: 私が見逃しているよりクリーンな方法はありますか?
ありがとう!