gpt4 book ai didi

apache-flex - flex 似乎没有与自定义 ActionScript 对象绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 02:31:32 26 4
gpt4 key购买 nike

我有一个自定义 ActionScript 对象,定义为可与许多公共(public)属性绑定(bind)。

[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();"/>

我的问题是,当我在手机号码字段中输入新值然后单击“保存”按钮时,输入的值不会注销...即:

    public function write():void {
var bytes:ByteArray = new ByteArray();
trace("write - mobile:" + this.mobileNumber);

bytes.writeObject(this);
EncryptedLocalStore.setItem(KEY, bytes);
}

我还尝试添加:

    private function init():void {
BindingUtils.bindProperty(mobileNumberText, "text", obj, "mobileNumber");
}

但也没有运气。

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

最佳答案

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

但是,您的 init() 方法存在两个问题。

首先,不清楚将 init() 方法放在哪里,或者调用它的是什么。

其次,你获得了倒退的方法参数。

在这种情况下,我通常会按照第一响应者的建议使用 mxml 标记,或者如果我使用 AS3 代码,我会执行以下操作:

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

这里请注意几点:

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

  obj.mobileNumber = mobileNumberText.text;

或者,更接近绑定(bind)类中“实际发生的情况”:

  obj["mobileNumber"] = mobileNumberText["text"];

2/BindingUtils.bindProperty() 实际上想要一个数组作为最后一个参数。这样您就可以逻辑地执行“链接属性”,如下所示:

obj.mobileNumber = mobileNumbersGrid.selectedItem.text;

这将是

BindingUtils.bindProperty(obj, "mobileNumber", mobileNumbersGrid,
["selectedItem", "text"]);

3/最佳实践提示:如果您要绑定(bind)一个属性链,其初始成员是您自己的属性(this),则将其写为:

BindingUtils.bindProperty(obj, "mobileNumber", this,
["mobileNumbersGrid", "selectedItem", "text"]);

这可以巧妙地处理“右侧对象” this.mobileNumbersGrid 实例本身被新实例对象替换的情况。

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

  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 实例,并且您需要 unwatch() 以防止旧对象接收属性更改)

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

关于apache-flex - flex 似乎没有与自定义 ActionScript 对象绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/907045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com