在实现Flex数据的双向绑定之前,由于自己对Flex刚接触所有处处碰壁,在自己了解基本原理后,参考了网上一位大侠的实例后,以下自己实现的数据双向绑定,绝对可以跑起来的。在此过程中自己也碰到了ReferenceError: Error #1056错误,根据自己的理解后给出了一个比较具有技巧的、实用的方法。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute">
<mx:Script>
<![CDATA[
import cn.sloppy.User;
import mx.binding.utils.ChangeWatcher;
import mx.controls.Alert;
import cn.sloppy.TwoWayBinding;
[Bindable]
private var user:User;
private function init():void{
user = new User("wenxing");
TwoWayBinding.create(myText,"text",user,"Name");
}
private function showUserNameHandler():void{
Alert.show(user.Name);
user.Name = "hello world";
}
]]>
</mx:Script>
<mx:TextInput text="{user.Name}" id="myText" x="118" y="31"/>
<mx:Button x="118" y="77" click="showUserNameHandler()" label="Button"/>
</mx:Application>
package cn.sloppy
{
public class User
{
private var name:String;
public function User(pName:String)
{
name = pName;
}
[Bindable]
public function get Name():String
{
return name;
}
public function set Name(pName:String):void
{
name = pName;
}
}
}
package cn.sloppy
{
import flash.events.Event;
import mx.binding.utils.ChangeWatcher;
public class TwoWayBinding
{
public static function create(src1:Object, prop1:String, src2:Object, prop2:String):void
{
var flag:Boolean = false;
ChangeWatcher.watch(src1, prop1, function(event:Event):void
{
if(!flag)
{
flag = true;
src2[prop2] = src1[prop1];
flag = false;
}
});
ChangeWatcher.watch(src2, prop2, function(event:Event):void
{
if(!flag)
{
flag = true;
src1[prop1] = src2[prop2];
flag = false;
}
});
}
}
}
以上是实现数据双向绑定的代码;
User类是我自己写的,但在运行的时候就出现了ReferenceError: Error #1056: 无法为 cn.sloppy.User创建属性 name;
解决方法为TwoWayBinding.create(myText,"text",user,"Name"); "Name"第一个字母必须大写;
原理(本人的理解):因为我们只能通过user.Name去调用我们的getter方法,所有我们必须使用Name,这样也导致我们在定义类的私有属性是第一个字母必须小写不然也会报同样的错误。这是自己的理解哦 有意见请加QQ:305677472