0

私は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フォーラムに属している可能性があることを認識していますが、ここの誰かがこれらすべてについて何らかの洞察を持っていることを期待しています)。

4

1 に答える 1

1

AddOffer.mxmlには、次のコードがあります。

[Bindable]     
public var model:AddOfferModel;

これを有効なAddOfferModelに設定しているAddOffer.mxmlの外部に何かがありますか?あるはずです。Flexコンポーネントのライフサイクルの性質上、ビューの構築時に物事がnullになることがあると予想できます。したがって、データが最終的に良好になった場合に、不良データを受信した後に「自分自身を正す」ことができるようにコンポーネントを構築する必要があります。

データバインディングはこれを行う1つの方法ですが、他に何が起こっているかによっては、すべてを網羅するわけではありません。

ユーザーが日付を選択した時点で取得しているモデル値がnullではなく、そのofferStartDateプロパティとofferEndDateプロパティに有効なEditableInstantsが設定されていることを確認しましたか?これらの両方が正しければ、特定の瞬間に何かがあると予想されるビューの一部を探し始め、後で提供されても回復しません。

于 2012-06-20T04:13:54.043 に答える