<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Li Guoliang &#187; Bindable</title>
	<atom:link href="http://liguoliang.com/tag/bindable/feed/" rel="self" type="application/rss+xml" />
	<link>http://liguoliang.com</link>
	<description>ActionScript Flex Java JEE PHP...</description>
	<lastBuildDate>Mon, 21 May 2012 17:04:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Flex: Bindable注意事项</title>
		<link>http://liguoliang.com/2009/flex-bindable%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9/</link>
		<comments>http://liguoliang.com/2009/flex-bindable%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 07:34:26 +0000</pubDate>
		<dc:creator>Guoliang</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Bindable]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2009/02/789/</guid>
		<description><![CDATA[Bindable通过Event机制来实现. 详见: <a title="http://liguoliang.com/2008/09/104/" href="http://liguoliang.com/2008/09/104/">http://liguoliang.com/2008/09/104/</a>
但是在该过程中, 时常会因不小心变更对象 导致Bindable无法继续. 如下:
某DataGrid, 其dataprovider为 studentsAC – ArrayColl<p class='read-more'><a href='http://liguoliang.com/2009/flex-bindable%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9/'>More...</a></p><p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></description>
			<content:encoded><![CDATA[<p>Bindable通过Event机制来实现. 详见: <a title="http://liguoliang.com/2008/09/104/" href="http://liguoliang.com/2008/09/104/">http://liguoliang.com/2008/09/104/</a></p>
<p>但是在该过程中, 时常会因不小心变更对象 导致Bindable无法继续. 如下:</p>
<p>某DataGrid, 其dataprovider为 studentsAC – ArrayCollection</p>
<p>如下:</p>
<p>var studentsAC = new StudentAC();</p>
<p>dataGrid.dataprovider = studentsAC;</p>
<p>&#160;</p>
<p>此后对studentAC进行任何操作都会及时在DataGrid中显示出来.</p>
<p>但如果进行</p>
<p>studentsAC = getStudentsACFromServer(); </p>
<p>DataGrid将不会进行更新, 应使用:</p>
<p>dataGrid.dataprovider = getStudentsACFromServer(); ,</p>
<p>或选择将getStudentsACFromServer();中内容添加到studentsAC 中.</p>
<p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2009/flex-bindable%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex中Event与Bindable</title>
		<link>http://liguoliang.com/2008/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0event%e4%b8%8ebindable/</link>
		<comments>http://liguoliang.com/2008/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0event%e4%b8%8ebindable/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 13:28:25 +0000</pubDate>
		<dc:creator>Guoliang</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Bindable]]></category>
		<category><![CDATA[Event]]></category>

		<guid isPermaLink="false">http://liguoliang.com/2008/09/104/</guid>
		<description><![CDATA[<blockquote><p>[小站博客均为原创, 转载请保留以下信息:</p>
<p>作者:<a id="r_l_1" href="../" target="_blank">http://liguoliang.com</a> 欢迎访问:Adobe上海用户组: <a id="r_l_2" href="http://riashanghai.com/" target="_blank">http://riashanghai.com </a>]</p></blockquote>
<h2>Event:</h2>
<p>1.事件派发 Dispatching</p>
<p>Flash.events.EventDispacher类提供了事件dispatch函数,如果需要dispatch事件,则应该考虑继承该类或其子类.如果不能继承该类,则应事先IEventDispatcher接口</p>
<p>2.监听事件 Listening to Events</p>
<p>在监听事件时应首先考虑是否要使用weak referenced.如果事件监听与派发与监听函数有共同的生命周期,则可以使用strong referenced,在其他的大部分情况下,则应使用weak referenced.<br />
需要注意的是, 如果事件派发者属性为Public, 则在任何允许的地方都可以增加监听函数, 从而达到低内聚, 更易于操作.</p>
<p></p><p class='read-more'><a href='http://liguoliang.com/2008/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0event%e4%b8%8ebindable/'>More...</a></p><p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p>[小站博客均为原创, 转载请保留以下信息:</p>
<p>作者:<a id="r_l_1" href="../" target="_blank">http://liguoliang.com</a> 欢迎访问:Adobe上海用户组: <a id="r_l_2" href="http://riashanghai.com/" target="_blank">http://riashanghai.com </a>]</p></blockquote>
<h2>Event:</h2>
<p>1.事件派发 Dispatching</p>
<p>Flash.events.EventDispacher类提供了事件dispatch函数,如果需要dispatch事件,则应该考虑继承该类或其子类.如果不能继承该类,则应事先IEventDispatcher接口</p>
<p>2.监听事件 Listening to Events</p>
<p>在监听事件时应首先考虑是否要使用weak referenced.如果事件监听与派发与监听函数有共同的生命周期,则可以使用strong referenced,在其他的大部分情况下,则应使用weak referenced.<br />
需要注意的是, 如果事件派发者属性为Public, 则在任何允许的地方都可以增加监听函数, 从而达到低内聚, 更易于操作.</p>
<p><span id="more-104"></span></p>
<h2>Bindable的三种实现方式:</h2>
<p>1.使用Event实现.</p>
<p>2.MXML中使用大括号实现.</p>
<p>3.AS中使用ChangeWatcher实现.</p>
<p>Event与Bindable举例:</p>
<p><a href="http://liguoliang.com/wp-content/uploads/2008/09/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://liguoliang.com/wp-content/uploads/2008/09/image-thumb.png" border="0" alt="image" width="244" height="91" /></a></p>
<p>有一个Person类:</p>
<pre class="java" name="code">package com.insprise
{
import flash.events.Event;
import flash.events.EventDispatcher;
import mx.events.PropertyChangeEvent; </code>

public class Person extends EventDispatcher
{
private var _name:String;
private var _age:int;
private var _desc:String;
/**
* 构造函数
*/
public function Person()
{
super();
}
/**
* Get&amp;Set Name SetName时dispatch一个PropertyChangeEvent事件
*/
[Bindable(event="propertyChange")]
public function get name():String {
trace("Get name: " + _name);
return _name;
}
public function set name(name_:String):void {
if(name_ == _name) {
return;
}
var old:String = this._name;
this._name = name_;
trace("Set Name to: " + name_);
dispatchEvent(PropertyChangeEvent.createUpdateEvent(this,"name",old,name_));
}
/**
* Get&amp;Set age; age被Set的时候会dispatch一个ageChanged事件.
*/
[Bindable(event="ageChanged")]
public function get age():int {
trace("Get age: " + _age);
return _age;
}
public function set age(age_:int):void {
if(age_ == _age) {
return;
}
var old:int = this._age;
this._age = age_;
trace("Set Age to: " + age_);
dispatchEvent(new Event("ageChanged"));

}
/**
* Get&amp;Set Desc;desc被set时会自动dispatch一个PropertyChangeEvent.
*/
[Bindable]
public function get desc():String {
trace("Get desc: " + _desc);
return _desc;
}
public function set desc(desc_:String):void {
if(desc_ == _desc) {
return;
}
var old:String = this._desc;
this._desc = desc_;
trace("Set desc to: " + desc_);
}
}
}
</pre>
<p>现在我们通过上面提到的三种方式实现Bindable:</p>
<h2>1.使用Event Bindable:</h2>
<pre class="java" name="code">
import mx.events.PropertyChangeEvent;
import com.insprise.Person;
var person:Person = new Person();
/**
* 监听PropertyChangeEvent与ageChanged事件
*/
private function init():void {
person.addEventListener("propertyChange",propertyChangeHandler);
person.addEventListener("ageChanged",ageChangedHandler);
}

/**
* 通过对PropertyChangeEvent.property判断是name还是desc被监听,更新屏幕
*/
private function propertyChangeHandler(e:PropertyChangeEvent):void {
if(e.property == "name") {
textArea_Name.text = e.newValue.toString();
}else if(e.property == "desc") {
textArea_Desc.text = e.newValue.toString();
}else {
return;
}
trace("view: " + e.property + " Changed");
}

/**
* set age之后更新屏幕
*/
private function ageChangedHandler(e:Event):void {
textArea_Age.text = String(person.age);
}
</pre>
<h2>2.MXML使用大括号:</h2>
<h2>3.使用AS中的ChangeWatcher</h2>
<pre class="java" name="code">private function init():void {

    var nameWatcher:ChangeWatcher;

    var ageWatcher:ChangeWatcher;

    var descWatcher:ChangeWatcher;

    var canWatche:ChangeWatcher;

    //nameWatcher = BindingUtils.bindProperty(textArea_Name,"text",person,"name");

    ChangeWatcher.watch(person,"name",nameSetter);

    ageWatcher = BindingUtils.bindProperty(textArea_Age,"text",person,String("age"));

    descWatcher = BindingUtils.bindProperty(textArea_Desc,"text",person,"desc",true);

}

private function nameSetter(e:PropertyChangeEvent):void {

    if(e==null) {

        return;

    }

    textArea_Name.text = e.newValue.toString();

    trace("Name Changed by nameSetter on the Event " + e + " to " + e.newValue);

} 

private function ageSetter(e:Event):void {

    //textArea_Age.text = String(person.age);

    trace("Age is setted by ageSetter on the Event " + " to " + person.age);

}</pre>
<p><p>

----------Post from: <a href="http://liguoliang.com">@LiGuoliang.com, 欢迎回来~</a>----------</p></p>
]]></content:encoded>
			<wfw:commentRss>http://liguoliang.com/2008/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0event%e4%b8%8ebindable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

