Flex 3中跨多个对象的数据绑定

时间:2012-06-20 01:02:01

标签: flex data-binding actionscript flex3 bindable

我是Flex的新手(已被指派维护一个旧项目)并且在使数据绑定正常工作方面遇到了一些麻烦。我有一个弹出窗体类AddOffer.mxml,它使用模型AddOfferModel.as。在我的弹出窗体中,我有以下组件:

    <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;

我试图绑定的模型变量是标准的getter / setter,在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组件类中,start和stop变量如下所示:

    [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类中的start和stop变量绑定到AddOfferModel.as文件中的offerStartDate和offerStopDate变量。每当我访问OfferWindowDatesFragment类中的函数中的启动/停止变量时,它们都为空。

我有一个事件监听器函数,只要用户选择一个新日期就会在OfferWindowDatesFragment中触发,它看起来像这样:

    private function changeOfferDate():void
    {
        start.currentValue = offerDateEditor.start;
    stop.currentValue  = offerDateEditor.stop;
    }

每次我到达这个函数时,都会抛出一个错误,因为'start'和'stop'都是null ...但是应该已经初始化并绑定了。如果我查看调试器中的变量,我可以确认赋值表达式右侧的值是有效的,而不是导致错误的原因。

我并不熟悉初始化在Flex中的工作方式,我假设只要我实例化组件,如我帖子顶部的第一个代码片段所示,它会初始化所有类变量,并设置绑定。我错过了什么吗?也许我没有正确地初始化AddForm.mxml或AddFormModel.as的模型或类数据,从而将null引用绑定到我的OfferWindowDatesFragment类中的开始/停止字段?

非常感谢任何帮助。谢谢!

修改

我进一步研究了这个并尝试使用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论坛,但我希望这里有人能对这一切有所了解。)

1 个答案:

答案 0 :(得分:1)

在AddOffer.mxml中,您有以下代码:

[Bindable]     
public var model:AddOfferModel;

AddOffer.mxml之外是否有将此设置为有效的AddOfferModel的内容?应该有。 Flex组件生命周期的本质意味着您可以期望View构建时有时可能会为null。所以你应该构建你的组件,以便在收到错误数据后能够“正确”,如果数据最终会好的话。

数据绑定是实现此目的的一种方式,但它可能不会取决于所有其他内容。

您是否确认在用户选择日期并且其offerStartDate和offerEndDate属性已使用有效的EditableInstants填充时,您获得的模型值不为空?如果这两个都是正确的,我会开始寻找希望在给定时刻拥有东西的视图片段,如果稍后提供则不会恢复。