私はFlexを初めて使用し(古いプロジェクトを作業中に維持するように割り当てられました)、データバインディングを正しく機能させるのに問題があります。モデルAddOfferModel.asを使用するポップアップフォームクラスAddOffer.mxmlがあります。ポップアップフォームには、次のコンポーネントがあります。
<mx:FormItem label="{getResource('addOffer.form.OFFER_DATE')}:"
labelWidth="90">
<views:OfferWindowDatesFragment
id="offerWindowField"
start="{model.offerStartDate}"
stop="{model.offerStopDate}" />
</mx:FormItem>
AddForm.mxmlファイルには、「model」変数を定義するアクションスクリプトも埋め込まれています。
[Bindable]
public var model:AddOfferModel;
私がバインドしようとしているモデル変数は標準のゲッター/セッターであり、AddOfferModel.as内では次のようになります。
[Bindable]
public function set offerStartDate(val:EditableInstant):void
{
_offerStartDate = val;
}
public function get offerStartDate():EditableInstant
{
return _offerStartDate;
}
private var _offerStartDate:EditableInstant;
[Bindable]
public function set offerStopDate(val:EditableInstant):void
{
_offerStopDate = val;
}
public function get offerStopDate():EditableInstant
{
return _offerStopDate;
}
private var _offerStopDate:EditableInstant;
OfferWindowDatesFragmentコンポーネントクラス内では、開始変数と停止変数は次のようになります。
[Bindable]
public function set start(val:EditableInstant):void
{
_start = val;
}
public function get start():EditableInstant
{
return _start;
}
private var _start:EditableInstant;
[Bindable]
public function set stop(val:EditableInstant):void
{
_stop = val;
}
public function get stop():EditableInstant
{
return _stop;
}
private var _stop:EditableInstant;
基本的に、OfferWindowDatesFragmentクラスの開始変数と停止変数をAddOfferModel.asファイルのofferStartDate変数とofferStopDate変数にバインドしたいだけです。OfferWindowDatesFragmentクラス内の関数で開始/停止変数にアクセスするときはいつでも、それらはnullです。
ユーザーが新しい日付を選択するたびにOfferWindowDatesFragmentでトリガーされるイベントリスナー関数があります。これは次のようになります。
private function changeOfferDate():void
{
start.currentValue = offerDateEditor.start;
stop.currentValue = offerDateEditor.stop;
}
この関数に到達するたびに、「start」と「stop」が両方ともnullであるため、エラーがスローされます...ただし、すでに初期化されてバインドされている必要があります。デバッガーで変数を見ると、エラーの原因ではなく、代入式の右側の値が有効であることが確認できます。
Flexでの初期化のしくみについてはよくわかりません。投稿の上部にある最初のコードスニペットに示されているようにコンポーネントをインスタンス化する限り、すべてのクラス変数が初期化され、バインディングがセットアップされると思いました。私は何かが足りないのですか?おそらく、AddForm.mxmlまたはAddFormModel.asのモデルまたはクラスデータを適切に初期化していないため、OfferWindowDatesFragmentクラスの開始/停止フィールドにnull参照がバインドされていますか?
どんな助けでも大歓迎です。ありがとう!
編集:
これをさらに調べて、Mateを使用してAddOffer.mxml内に有効なAddOfferModelオブジェクトを含む「model」変数を挿入してみました。
<Injectors target="{AddOffer}" debug="{debug}">
<ObjectBuilder generator="{AddOfferModel}" constructorArguments="{scope.dispatcher}" cache="local"/>
<PropertyInjector targetKey="model" source="{lastReturn}" />
</Injectors>
別のフォームでのボタンクリックイベントの結果として、AddOffer.mxmlダイアログをロードします。ポップアップする関数は次のようになります。
public function addOffer():void
{
var addOfferDialog:AddOffer = new AddOffer();
addOfferDialog.addEventListener("addOffer", addOfferFromDialog);
modalUtil.popup(addOfferDialog);
}
AddOffer.mxmlの「model」変数に何も割り当てていないようです。この方法でビュー/ダイアログをロードしても、Mateからのインジェクションが偶然にトリガーされることはありませんか?(この最後の部分はMateフォーラムに属している可能性があることを認識していますが、ここの誰かがこれらすべてについて何らかの洞察を持っていることを期待しています)。