当定义该文本的Object属性更新时,如何确保更新ActionScript TextInput的文本?

时间:2009-09-30 19:24:27

标签: flex actionscript-3 data-binding text binding

破译不是一个简单的问题,所以让我把它煮沸。我正在尝试将MXML组件转换为ActionScript类。该组件包含一个带有TextInput,TextArea的Form和两个按钮 - Save和Cancel,以及TextInput的Validator,以及处理发生事件的其他逻辑。该组件目前由其他几个组件扩展。

现在,在MXML组件中,将TextInput文本属性绑定到Object中的属性非常简单:

<mx:TextInput text="{_itemToEdit.name}" />

但是在ActionScript中,我在创建TextInput并在设置Object之前设置text属性,并且TextInput没有被更新:

public var itemToEdit:Object = {};

private var nameInput:TextInput = new TextInput();

public function MyClass()
{
    nameInput.text = itemToEdit.name;
}

如何确保TextInput文本属性绑定到Object?

中的指定属性

4 个答案:

答案 0 :(得分:1)

绑定完全是关于触发更改事件。你需要将你的'itemToEdit'类修改为一个EventDispatcher才能使这个hack工作。这里去了

//item to edit class
private var _name:String;

public function set name(value:String):void
{
    _name = value;
    dispatchEvent(new Event("NAME_CHANGED"));
}


//whatever the binding class is
private var _itemToEdit:ItemToEdit;
private var _textField:TextField;

public function set itemToEdit(value:ItemToEdit):void
{
    if (_itemToEdit) removeEventListeners();
    _itemToEdit = value;
    if (_itemToEdit) addEventListeners();
}


private function addEventListeners():void
{
    _itemToEdit.addEventListener("NAME_CHANGED", itemToEdit_nameChangedHandler);
    itemToEditChangedHandler(null);
}

private function itemToEdit_nameChangedHandler(event:Event):void
{
    _textField.text = _itemToEdit.name;
}

显然这只是为了速度,你需要自定义事件和一些更好的名字等,但这是基本的jist。

答案 1 :(得分:0)

显然,它比纯粹在AS中绑定的简单任务稍微复杂一些,这里有几个教程/文档向您展示如何将它拉下来。

http://cookbooks.adobe.com/index.cfm?event=showdetails&postId=6802

http://raghuonflex.wordpress.com/2007/08/30/binding-in-mxml-as/

答案 2 :(得分:0)

使用-keep选项编译MXML组件。检查由mxmlc生成的ActionScript代码,并执行类似的操作。

你也可以使用Proxy对象 - 我在这里写博客:http://flexblog.faratasystems.com/?p=433

答案 3 :(得分:0)

如果“itemToEdit”是纯AS3对象,则绑定可能无法正常工作。也就是说,它将在最初创建对象时起作用,但不会检测到对象中“name”的任何更改。 (我可能错了......没有做过大量的测试)

无论如何,使用getter / setter很容易解决您的问题:

private var _itemToEdit:Object;

public function get itemToEdit():Object { return _itemToEdit; }
public function set itemToEdit(value:Objecy):void {
  _itemToEdit = value;
  nameInput.text = value.name;
}

此处不需要绑定。