在Flex开发的时候,很多情况下需要自定义组件,自定义组件里面有些属性在某些情况下有需要能够绑定。何谓绑定?就是在该属性发生改变的时候,能够触发事件。事件触发之后就好办啦,监听捕捉就可以了。
下面讲讲如何使属性具有可绑定性。
参阅flex 3 cookbook后,想了很久,那书确实不错,但是想彻底看懂确实需要些时间,我在这里就分享一下自己的经验,为大家节省时间。
【菜谱原文】
“当属性值发生改变时,在属性上添加Bindable元数据标签,发出相应事件,任何对象都可以被定义为可绑定属性。最佳方法就是通过get和set函数定义这些绑定属性。当属性被设置时,一个名称和Bindable标签一样的事件发出。”寥寥数语,我想您和我一样也不明白。
“当属性值发生改变时,在属性上添加Bindable元数据标签,发出相应事件,任何对象都可以被定义为可绑定属性。”这句话讲的是如何使用可绑定属性。
“最佳方法就是通过get和set函数定义这些绑定属性。当属性被设置时,一个名称和Bindable标签一样的事件发出。”这句话讲的是如何是属性具有绑定特性,就是通过get和set函数。
codeview:类person
package Package1
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class Person extends EventDispatcher
{
public static var NAME_CHANGE:String ="namechange";
private var _name1:String;
public function Person(value:String):void
{
_name1 = value;
}
[Bindable(event=NAME_CHANGE)]
public function get name1():String //注意get标签
{
trace("这是get");
return _name1;
}
public function set name1(value:String):void
{
_name1 = value;
dispatchEvent(new Event(NAME_CHANGE));
trace(_name1);
}
}
}
注:详细阐释一下使属性具有可绑定性的本质,当name1属性改变时,就会调用set方法;set方法里有NAME_CHANGE触发;因为get方法绑定了该事件,所以,会使得get方法返回新的name1值,从而实现各个绑定组件的更新。
自定义组件Com:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
width="400" height="300" xmlns:events="flash.events.*">
<mx:Script>
<![CDATA[
import Package1.Person;
[Bindable]
private var _person:Person = new Person("1");
public function set person(value:Person):void
{
_person = value;
}
]]>
</mx:Script>
<mx:Label x="167" y="70" text="{_person.name1}" width="113" height="41"/>
<mx:TextInput x="120" y="197" id="tp1" change="_person = new Person(tp1.text)"/>
</mx:Canvas>
注:在com组件这里纠结了很久,看菜谱上说是要改变name值就可验证该绑定是否成功,结果没有成功;后来思考了一下,因为在这个自定义组件里绑定的是person对象,所以我觉得要改变的话是要改变该person属性才行,一试果然成功了。在这里还要有一个概念,com组件其实就是一个类,而person就是它的一个成员变量。
主程序:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">
<ns1:Com x="168" y="10" id="com1">
</ns1:Com>
</mx:Application>
ok,就这样在主程序里的代码量会很小,这样对类进行比较高度的封装,会使得代码维护更容易。
【补】这个问题真的纠结了很久主要就是com组件中的问题,请详细看懂。