任何人都可以帮我解决这个谜团:
我有一个名为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 。我需要做一些额外的布尔变量吗?
提前多多感谢。
答案 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。