我是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论坛,但我希望这里有人能对这一切有所了解。)
答案 0 :(得分:1)
在AddOffer.mxml中,您有以下代码:
[Bindable]
public var model:AddOfferModel;
AddOffer.mxml之外是否有将此设置为有效的AddOfferModel的内容?应该有。 Flex组件生命周期的本质意味着您可以期望View构建时有时可能会为null。所以你应该构建你的组件,以便在收到错误数据后能够“正确”,如果数据最终会好的话。
数据绑定是实现此目的的一种方式,但它可能不会取决于所有其他内容。
您是否确认在用户选择日期并且其offerStartDate和offerEndDate属性已使用有效的EditableInstants填充时,您获得的模型值不为空?如果这两个都是正确的,我会开始寻找希望在给定时刻拥有东西的视图片段,如果稍后提供则不会恢复。