Flex中的可绑定属性更改事件

时间:2011-09-20 17:21:06

标签: actionscript-3 flex4.5

任何人都可以帮我解决这个谜团:

我有一个名为Box.as的组件,它具有以下两个属性,并且有他们的getter& setters定义:

private var _busy:Boolean;
private var _errorMessage:String;

在使用此组件的MXML中,我将其定义如下:

<components:Box skinClass="skins.components.BoxSkin"
                busy="{presenter.boxBusy}"
        errorMessage="{presenter.boxErrorMessage}"/>

其中 presenter 变量在MXML中定义,而Presenter类将boxBusy和boxErrorMessage变量定义为可绑定属性更改事件:

[Bindable(event="propertyChange")]
function get boxBusy():Boolean;
function set boxBusy(value:Boolean):void;

[Bindable(event="propertyChange")]
function get boxErrorMessage():String;
function set boxErrorMessage(value:String):void;

问题是每当我为演示者更改 boxErrorMessage 时,我都会看到MXML中的影响在我更改<时根本没有任何反应< EM> boxBusy 。我需要做一些额外的布尔变量吗?

提前多多感谢。

2 个答案:

答案 0 :(得分:8)

您应该在(event="propertyChange")[Bindable]上的boxBusy元数据标记中省略boxErrorMessage规范。另外,请确保将get / set方法声明为public。

因此,属性boxBusy看起来像这样:

[Bindable]
public function get boxBusy():Boolean {  return _busy; }
public function set boxBusy(value:Boolean):void {  _busy = value; }

当您使用[Bindable]限定(event="...")时,您告诉Flex,“只要应该更新绑定,我就会调度命名事件”。

如果省略事件规范,则flex假定事件名为propertyChange。但事实并非如此。它还使用生成的代码自动“包装”您的setter,该代码在使用setter修改值时透明地调度'propertyChange'事件。这将更详细地描述here, at adobe livedocs

所以......通过明确指定(event="propertyChange"),可以禁用flex的默认行为。即使您使用的是默认事件名称,flex也不会生成包装器代码 - 相反,它会指望您在适当的时间从代码中调度该事件。

我认为您的boxErrorMessage属性似乎正在工作,因为您的类的其他[Bindable]属性在同一个传递中发生变化 - 因此调度{{1 ,并导致您的propertyChange绑定更新为副作用。

答案 1 :(得分:0)

完全有可能的是,如果您在第一次调用setter时将busyBox设置为 true ,但如果您再次尝试设置为 true则不会再次调用 STRONG>。当您使用[Bindable]标签时,flex编译器的代码将添加一个检查,以查看您是否将新值设置为getter当前将返回的值。如果这是原因则不会被调用 如果你要在true和false之间振荡,每次都会调用它,因为新值与当前值不同。但是将其设置为true-true-true-true-false只会导致第一次调用它并将其设置为最后一次设置为false。