Flex:mxmlページ間で機能/コンポーネントにアクセスする
-
06-07-2019 - |
質問
簡単にするために、2つのflex mxmlページがあるとします。
form.mxml
button.mxml
form.mxmlページに次のコードが含まれていれば、正常に機能するはずです:
<custom:SelectView dSource="{_thedata}" id="form" visible="false">
</custom:SelectView>
<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>
ただし、コードが次のような場合:
form.mxml
<custom:SelectView dSource="{_thedata}" id="form" visible="false">
</custom:SelectView>
button.mxml
<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>
form.mxmlを変更するためにbutton.mxmlから呼び出しを行う方法
----もう少し詳細---
私のページは実際には次のようになります。ここでquery:AdvancedSearchFieldsは基本的にページにフレックスフォームを含んでおり、検索が完了した後に下のカスタムビューを表示/非表示にしたいです。
<query:AdvancedSearchFields searchType="projects" searchCategory="advanced" visible="true" id="AdvancedSearch" />
<custom:SelectView dSource="{_searchResults}" id="sv" visible="false">
解決
ボタンクリックイベントを処理し、カスタムイベントを発生させるカスタムメソッドを作成できます。その後、form.mxmlでそのイベントを処理できます。
このように分割すると、button.mxmlファイルが単独で機能するため、少しきれいになります。 Button.mxmlにフォームへの直接参照を持たせると、2つの間の密結合が発生します。通常、密結合は避ける必要があります。
編集:密結合を回避し、もう少し単純な別の考えがありました:
form.mxml
<custom:SelectView dSource="{_thedata}" id="form" visible="{buttons.showForm}">
</custom:SelectView>
<!-- include your buttons.mxml component using an ID of "buttons" -->
buttons.mxml
<mx:Script>
<![CDATA[
[Bindable] public var showForm:Boolean = true;
]]>
</mx:Script>
<mx:LinkButton label="Show" id="lbShow" click="this.showForm=true;">
<mx:LinkButton label="Hide" id="lbHide" click="this.showForm=false;">
これは基本的に、変数バインディングを使用してカスタムイベントを使用してエミュレートします。ボタンのshowForm変数が変更されるたびに、バインディングを介してSelectViewの表示プロパティが更新されます。これは、カスタムイベントを作成するよりも軽量です(ただし、カスタムイベントはそれよりもデザインが優れていると思います)。
他のヒント
button.mxml
クラスには、影響を受ける 'form'クラスのインスタンスへの参照が必要です。その後、直接操作できます:
Button.mxml:
<mx:Script>
<![CDATA[
[Bindable] public var myForm:MyFormClass;
]]>
</mx:Script>
<mx:LinkButton label="Show" id="lbShow" click="myForm.form.visible=true;">
<mx:LinkButton label="Show" id="lbHide" click="myForm.form.visible=false;">
一般に、この変数を設定する最も論理的な場所は、 Button
クラスの親です。
この問題にもっと頻繁に対処する必要がある場合は、PureMVCのようなMVCフレームワークを使用することをお勧めします。 MXMLコンポーネントからのイベントをリッスンし、他のメディエーターが取得できる通知を送信するMediatorオブジェクトを持つように設定されています。その後、そのメディエーターは、通知とその関連データに基づいて独自の視覚コンポーネントを操作できます。
あなたがやっていることの文脈(単純なバージョン)では、基本的な解決策で大丈夫です。しかし、多くのロジックを備えた4つまたは5つ以上のコンポーネントを扱うと、まったく満足できなくなります。