Apache flex flex没有';似乎无法与自定义actionscript对象绑定

Apache flex flex没有';似乎无法与自定义actionscript对象绑定,apache-flex,actionscript-3,binding,Apache Flex,Actionscript 3,Binding,我有一个自定义actionscript对象,它被定义为可绑定的,具有许多公共属性 [Bindable] public class MyObject extends Object { public var mobileNumber:String; ... 在我的mxml中,我有: <mx:Script><![CDATA[ import mx.binding.utils.BindingUtils; import org.test.MyObject;

我有一个自定义actionscript对象,它被定义为可绑定的,具有许多公共属性

[Bindable]
public class MyObject extends Object {   

    public var mobileNumber:String;
...
在我的mxml中,我有:

<mx:Script><![CDATA[
    import mx.binding.utils.BindingUtils;
    import org.test.MyObject;

    [Bindable]
    private var obj: MyObject = new MyObject();
]]></mx:Script>

<mx:Label text="Mobile Number" id="mobileNumberLabel"/>
<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" />

<mx:LinkButton label="Load" id="loadButton" enabled="true" click="obj = obj.load();"/>
<mx:LinkButton label="Save" id="saveButton" enabled="true" click="obj.write();"/>
我还试着加入:

    private function init():void {
        BindingUtils.bindProperty(mobileNumberText, "text", obj, "mobileNumber");
    }  
但这也没什么好运气


我可能遗漏了一些简单的东西,但不确定是什么。希望你能帮忙,谢谢

您是否尝试实现
IEventDispatcher
,或扩展
EventDispatcher

绑定是通过分派
属性更改事件来工作的,所以这可能就是问题所在?
另外,我不确定绑定是否对变量起作用,或者它们是否需要属性(getter/setter)

您应该尝试使用-keep-generated-actionscript进行编译,并查看生成的代码是否有意义,即如果访问了变量,则发送任何事件…

此代码:

<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" />

在obj.mobileNumber和mobileNumberText.text之间进行单向绑定。您需要的是一个额外的反向绑定-将以下行添加到代码中,它将起作用:

<mx:Binding source="mobileNumberText.text" destination="obj.mobileNumber"/>

tst的答案是正确的-绑定是单向的。我猜您已经知道了,因为您试图在init()方法中设置反向绑定

但是,init()方法有两个问题

首先,不清楚您将init()方法放在哪里,或者调用它的内容

第二,方法参数是反向的

在这种情况下,我通常会使用mxml标记作为第一响应者的建议,或者如果我使用AS3代码,我会这样做:

private function onCreationComplete(event:Event):void
{
  BindingUtils.bindProperty(obj, "mobileNumber", mobileNumberText, ["text"]);
}
  public function get obj():MyObject
  {
    return _obj;
  }

  private var _obj:MyObject = new MyObject();

  public function set obj(value:MyObject):void
  {
    _obj = value;
    BindingUtils.bindProperty(_obj, "mobileNumber", mobileNumberText, ["text"]);
  }
请注意以下几点:

1/BindingUtils.bindProperty()是“左侧=右侧”。因此,这有点像写作

  obj.mobileNumber = mobileNumberText.text;
或者,更接近绑定类内部的“实际情况”:

  obj["mobileNumber"] = mobileNumberText["text"];
2/BindingUtils.bindProperty()实际上希望数组作为最后一个参数。这样,您就可以在逻辑上执行“链接属性”,如:

obj.mobileNumber = mobileNumbersGrid.selectedItem.text;
那是什么

BindingUtils.bindProperty(obj, "mobileNumber", mobileNumbersGrid,
    ["selectedItem", "text"]);
3/最佳实践提示:如果您绑定的属性链的初始成员是您自己的属性(此),则将其编写为:

BindingUtils.bindProperty(obj, "mobileNumber", this,
    ["mobileNumbersGrid", "selectedItem", "text"]);
这很好地处理了“右侧对象”This.mobileNumbersGrid实例本身被新实例对象替换的情况

4/如果重新分配obj(“左侧”),则需要创建一个新绑定到新的obj实例。通常,可以通过将本地obj属性转换为getter/setter对来实现这一点,如下所示:

private function onCreationComplete(event:Event):void
{
  BindingUtils.bindProperty(obj, "mobileNumber", mobileNumberText, ["text"]);
}
  public function get obj():MyObject
  {
    return _obj;
  }

  private var _obj:MyObject = new MyObject();

  public function set obj(value:MyObject):void
  {
    _obj = value;
    BindingUtils.bindProperty(_obj, "mobileNumber", mobileNumberText, ["text"]);
  }
(注意:为了真正小心,您应该隐藏BindingUtils.bindProperty()返回的值,它是一个ChangeWatcher实例,您应该取消对()的访问以防止旧对象接收属性更改)


希望这有帮助。绑定是Flex框架中最强大的工具之一,但如果使用不当,可能会导致很多麻烦。特别是,当绑定“挂起”时,请注意内存泄漏和“意外更新”。

Kieren H-这能解决您的问题吗?如果是,请标记为已回答!你是一个十足的传奇人物——我一直有这么多的约束问题,你在这里的回答解释了很多事情发生的原因,以及为什么事情有时似乎随机不起作用。GWI也应该详细说明绑定的内存泄漏影响。为了观察“右侧”中的变化,绑定机制向右侧对象(整个链中的每个对象)添加一个事件侦听器。这些事件监听器指向绑定对象(ChangeWatchers),因此,即使在您自己的对象消失之后,也会将这些监听器保留在内存中。因此,当我的对象离开时,我尝试始终保留对watcher(watcher=BindingUtils.bindProperty(…)的引用,然后保留对watcher.unwatch()的引用,以删除所有这些事件侦听器