Apache flex Flex work中的一些[Bindable]属性,一些don';T
问题已解决,请参见下文 问题: 我在Flex Builder 3中工作,我有两个ActionScript 3类(Apache flex Flex work中的一些[Bindable]属性,一些don';T,apache-flex,data-binding,bindable,Apache Flex,Data Binding,Bindable,问题已解决,请参见下文 问题: 我在Flex Builder 3中工作,我有两个ActionScript 3类(ABC和XYZ)和一个Flex MXML项目(main.MXML)。我有一个XYZ的实例作为ABC的属性,我希望XYZ的属性在文本控件的Flex项目中可见([Bindable]) 不幸的是,只有prop3和prop4在更改时才会更新。我已进入调试器,以确保prop1和prop2发生更改,但它们不会在文本控件中更新 代码如下: 美国广播公司 XYZ.as 主程序文件 答复 从我发布的
ABC
和XYZ
)和一个Flex MXML项目(main.MXML
)。我有一个XYZ
的实例作为ABC
的属性,我希望XYZ
的属性在文本控件的Flex项目中可见([Bindable]
)
不幸的是,只有prop3
和prop4
在更改时才会更新。我已进入调试器,以确保prop1
和prop2
发生更改,但它们不会在文本控件中更新
代码如下:
美国广播公司
XYZ.as
主程序文件
答复
从我发布的小代码片段中看不出这一点,但在
XYZ
中,我使用设置器更新了\u prop3
和\u prop4
。相反,我通过它们的私有变量而不是设置器更新了\u prop1
和\u prop2
。因此,属性1和属性2没有分派更新事件。看起来您的getter正在返回空洞。根据字段类型,他们应该返回UINT
否则,您的代码应该可以正常工作。我已经组装并测试了一个工作版本,该版本带有一个设置所有四个值的计时器,因此您可以看到所有四个更新:
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>
XYZ.as
package
{
import mx.core.UIComponent;
[Bindable]
public class ABC extends UIComponent
{
public var xyz:XYZ = new XYZ();
public function ABC()
{
super();
}
}
}
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;
}
}
}
看看这些,插上电源,你会看到所有的东西都在一起。如果您有任何问题,请发回。干杯。当您通过使用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的任何组件该属性已更改。事实上,我只是在这里犯了void返回类型错误。我实际代码中的所有setter都返回uint。抱歉搞混了。好的。那么我在这里发布的代码应该对您有用——我已经测试过了。您可以自由地运行它,并将其与您现在拥有的进行比较,然后使用您需要的任何部件来修复您的终端。祝你好运抱歉,这么长时间了,我有一点不懂代码了。我刚刚尝试了您的测试示例,它成功了,所以我想我的代码中有一个bug。谢谢啊哈,我修好了。事实证明,当我更改属性3和4(从XYZ内部)时,我正在使用属性的setter,从而触发要调度的适当事件。对于属性1和2,我通过修改_prop1和_prop2来更改它们。因为我没有呼叫setter,所以没有发送任何事件。我想我今天学到了一些东西:)太棒了!很高兴这有帮助。干杯。:)如果类被标记为[Bindable],则不需要这样做。还需要为每个属性设置特定的侦听器——作为一个例子,这很好,但OP要求的是开箱即用的东西,应该“正常工作”,而不需要所有额外的黏液。你是对的。如果类被标记为可绑定的,则不需要显式地标记属性。
package
{
import mx.core.UIComponent;
[Bindable]
public class ABC extends UIComponent
{
public var xyz:XYZ = new XYZ();
public function ABC()
{
super();
}
}
}
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;
}
}
}
[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 */
}