问题已解决,请参阅下文
我在Flex Builder 3中工作,我有两个ActionScript 3类(ABC
和XYZ
)和一个Flex MXML项目(main.mxml
)。我有XYZ
的实例作为ABC
的属性,我希望XYZ
的属性在文本控件的Flex项目中可见([Bindable]
)。< / p>
不幸的是,只有prop3
和prop4
在更改后才会更新。我已进入调试器以确保prop1
和prop2
发生更改,但文档控件中未更新它们。
以下是代码:
[Bindable]
public class ABC extends UIComponent {
/* Other properties */
public var xyz:XYZ = new XYZ();
/* Methods that update xyz */
}
[Bindable]
public class XYZ extends Object {
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
}
/* getters and setters for prop2, prop3, and prop4 */
}
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:com="com.*" />
<com:ABC id="abc" />
<mx:Text text="{abc.xyz.prop1}" />
<mx:Text text="{abc.xyz.prop2}" />
<mx:Text text="{abc.xyz.prop3}" />
<mx:Text text="{abc.xyz.prop4}" />
</mx:Application>
我发布的小代码片段并不明显,但是从XYZ
_prop3
内部我使用他们的二传手更新了_prop4
和_prop1
。相反,我通过他们的私有变量而不是他们的setter更新了_prop2
和{{1}}。因此,属性1和2不会调度更新事件。
答案 0 :(得分:6)
看起来你的吸气剂正在回归空洞。根据你的田野类型,他们应该回归。
否则您的代码应该正常工作。我已经组装并测试了一个带有Timer的工作版本,它设置了所有四个值,因此您可以看到所有四个更新:
<强> Main.mxml:强>
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
private function onCreationComplete():void
{
var t:Timer = new Timer(1000);
t.addEventListener(TimerEvent.TIMER, t_tick);
t.start();
}
private function t_tick(event:TimerEvent):void
{
var i:uint = Timer(event.currentTarget).currentCount;
abc.xyz.prop1 = i;
abc.xyz.prop2 = i;
abc.xyz.prop3 = i;
abc.xyz.prop4 = i;
}
]]>
</mx:Script>
<local:ABC id="abc" />
<mx:VBox>
<mx:Text text="{abc.xyz.prop1}" />
<mx:Text text="{abc.xyz.prop2}" />
<mx:Text text="{abc.xyz.prop3}" />
<mx:Text text="{abc.xyz.prop4}" />
</mx:VBox>
</mx:Application>
<强> ABC.as 强>
package
{
import mx.core.UIComponent;
[Bindable]
public class ABC extends UIComponent
{
public var xyz:XYZ = new XYZ();
public function ABC()
{
super();
}
}
}
<强> XYZ.as 强>
package
{
[Bindable]
public class XYZ extends Object
{
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
public function XYZ()
{
super();
}
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
}
public function get prop2():uint {
return _prop2;
}
public function set prop2(value:uint):void {
_prop2 = value;
}
public function get prop3():uint {
return _prop3;
}
public function set prop3(value:uint):void {
_prop3 = value;
}
public function get prop4():uint {
return _prop4;
}
public function set prop4(value:uint):void {
_prop4 = value;
}
}
}
看看那些,插入内容,你应该看到它们都在一起。如果您有任何疑问,请回复。欢呼声。
答案 1 :(得分:1)
通过使用getter和setter定义可绑定源时,绑定似乎不起作用。解决方案是为getter声明一个可绑定事件,并在setter中调度该事件:
[Bindable]
public class XYZ extends Object {
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
[Bindable(event="prop1Changed")]
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
dispatchEvent (new Event ("prop1Changed"));
}
/* getters and setters for prop2, prop3, and prop4 */
}
因此,只要您的私有成员发生更改,就会调度一个事件,通知任何链接到getter的组件,该属性已更改。