0

我是 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 文件还有一些嵌入的动作脚本,我在其中定义了我的“模型”变量:

    [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 组件类中,开始和停止变量如下所示:

    [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'都是空的......但应该已经被初始化和绑定了。如果我查看调试器中的变量,我可以确认赋值表达式右侧的值是有效的,而不是导致错误的原因。

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

任何帮助将不胜感激。谢谢!

编辑:

我进一步研究了这一点,并尝试使用 Mate 在 AddOffer.mxml 中使用有效的 AddOfferModel 对象注入“模型”变量:

    <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 中的“模型”变量分配任何内容。以这种方式加载视图/对话框不会偶然触发来自 Mate 的注入吗?(我意识到这最后一部分可能属于 Mate 论坛,但我希望这里有人可能对所有这些有一些见解)。

4

1 回答 1

1

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

[Bindable]     
public var model:AddOfferModel;

AddOffer.mxml 之外是否有将其设置为有效的 AddOfferModel 的东西?应该有。Flex 组件生命周期的性质意味着您可以预期在构建视图时有时事物可能为空。所以你应该构建你的组件,以便在接收到坏数据后能够“自我纠正”,如果数据最终是好的。

数据绑定是执行此操作的一种方法,但它可能不会覆盖所有内容,具体取决于其他情况。

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

于 2012-06-20T04:13:54.043 回答