2


1

外部ASからMXMLで定義された要素へのアクセス

私はフォームとその中に2つのTextInputを持つMXMLを持っています。 私はMXMLファイルの中にコードの一部があるのは嫌いです(私はJavaScript形式から来ています)。

mx:Script source="external.as"

MXMLファイルで使用されているコードを含めるためのタグ。 問題は、 `+ external.as +`ファイルにこのコードがある場合:

private function populateFromForm():void{
   var vo:ValidObject= new ValidObject();
   vo.market = marketInput.text;
   vo.segment = segmentInput.text;
   vo.priceLow = priceLowInput.text;
   vo.priceHigh = priceHighInput.text;
}

marketInput、segmentInput、priceLowInput、およびpriceHighInputは、MXMLファイルで定義されているTextInputです。 コンパイルしようとすると、* 1120:undefined property XXXXX *にアクセスします。

関数の前にこの行を追加してみました。

public var marketInput:TextInput;
public var segmentInput:TextInput;
public var priceLowInput:TextInput;
public var priceHighInput:TextInput;

しかし代わりに私は* 1151を得ます:名前空間internal *の中の定義XXXXと矛盾があります、これは完全に意味があります。

すべての入力参照を関数のパラメータとして関数に渡す必要なしにこれを実行する方法はありますか?

5 Answer


5


TextInputsの親コンテナのインスタンスへの参照を作成し、その参照を使用してTextInputsとそのプロパティを評価する必要があります。 私たちはあなたのファイル構造を明確にする必要があると思います。 親コンテナのインスタンスをどのように作成しますか? 私はこれがあなたがする必要があることであると思います:

MyForm.mxml:


SaveVOContainer.as:

パッケージ{パブリッククラスSaveVoContainerはコンテナを拡張します。{プライベート変数myForm:MyForm = new MyForm();}

パブリック関数SaveVOContainer {this.addChild(myForm); }

プライベート関数populateFromForm():void {var vo:ValidObject = new ValidObject();} vo.market = myForm.marketInput.text; vo.segment = myForm.segmentInput.text; vo.priceLow = myForm.priceLowInput.text; vo.priceHigh = myForm.priceHighInput.text; }}}


3


「分離コード」を実行することはFlexでは苦痛です。 Javascriptのように、部分クラスやプロトタイプ継承の柔軟性の概念はありません。 多くのリソースのための「フレックスのコードビハインド」のためのグーグル。

私はあなたがmxmlにコードを埋め込むという考えに慣れるほうが良いと思う。 できるだけインラインコードを避けてスクリプトタグを使用してください。 MXML内で大量のコードを記述する必要がある場合は、おそらくコードを複数のカスタムコンポーネントにリファクタリングすることをお勧めします。 再利用可能であればボーナスポイント。


2


Flexでコードビハインドを実行するための標準的な方法は、継承を使用することです。 これは、ドキュメントからの良い説明です:http://learn.adobe.com/wiki/ display / flex / Code Behind。 手短に:

  1. 基本クラスとして使用するActionScriptクラスを宣言します。

  2. MXMLファイルでルートクラスとして基本クラスを設定します。

  3. MXMLファイルで宣言されたコントロールについては、まったく同じ名前を使用して基本クラスのパブリックメンバーとして再宣言する必要があります(ソースタグ付きのスクリプトブロックに対して上記で行ったのとまったく同じように機能します)。

だから、あなたのActionScriptファイル:

パッケージmypackage {import mx.controls.TextInput;

パブリッククラスmyClassはWindowedApplicationを拡張します。{public var marketInput:TextInput;}

プライベート関数populateFromForm():void {/ *上記* /}}}

そして対応するMXMLファイル:


他のTextInputコントロールも同様です。 そして、populateFromForm関数が機能するはずです。

同じエンティティを2回再宣言する必要があるのはちょっと面倒なことですが、前の回答者がそれを明らかにしたのはそれほど厄介なことではありません(ただし、これがFlex 4では変更されて痛みが少なくなりました)。


1


  • これを.ASにインポートします。 + + import mx.core.Application; +

  • .ASではこれを使用します。 + + mx.core.Application.application.component.property = value; + + mx.core.Application.application.myText.text = 'test'; +


0


ActionScriptファイルを指すスクリプトタグがmxmlファイルにありますか。