破译不是一个简单的问题,所以让我把它煮沸。我正在尝试将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?
中的指定属性答案 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;
}
此处不需要绑定。