縱然AS3中有addEventListener 和 removeEventListener方案,但是面對情況多變的屬性value值,這2個參數還是顯得力不從心。例如在Game中,玩家的exp , lv , combat等等變化的話總是需要通知很多的功能子產品,而exp , lv , combat這些資訊有時候并不在一個model(data)裡面,使用addEventListener 和 removeEventListener,顯得很臃腫 , 今天本人提供一種封裝,可以輕松的解決Model到UI的屬性監聽問題:
需要用到BindTool.swc将在附件中提供。
前景 : 假設有View 對 User(model)裡面的屬性(hp , state)進行監聽
關于 User(model):瑕疵是 字段(_hp , _state 必須被public修飾 , 有時間本人會繼續的改進)
package com
{
import com.bind.BaseData;
import flash.events.IEventDispatcher;
public final class User extends BaseData
public function User(target:IEventDispatcher=null)
{
super(target);
}
public var _hp : int = 20;
public function set HP( value : int ) : void
//設定并注冊(在基類中完成設定新值并廣播)
this.changeValue( "HP" , "_hp" , value );//屬性名稱 , 對應的字段名稱 , 值(目前的)
public function get HP():int
return _hp;
public var _state : uint = 10;
public function set State( value : uint ):void
this.changeValue( "State" , "_state" , value );//屬性名稱 , 對應的字段名稱 , 值(目前的)
public function get State():uint
return this._state;
}
假設 UserView.as需要監聽 User的HP 和 State
<code>package</code> <code>com</code>
<code>{</code>
<code> </code><code>import</code> <code>com.bind.BindTools;</code>
<code> </code>
<code> </code><code>import</code> <code>flash.display.Sprite;</code>
<code> </code><code>/**</code>
<code> </code><code>* 模拟一個視窗 , 當User中hp改變時 , 此視窗的相應值也會随之改變</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>final</code> <code>class</code> <code>UserView </code><code>extends</code> <code>Sprite</code>
<code> </code><code>{</code>
<code> </code><code>private</code> <code>var</code> <code>user : User = </code><code>null</code><code>;</code>
<code> </code>
<code> </code><code>private</code> <code>var</code> <code>_hp_view : </code><code>int</code> <code>= </code><code>0</code><code>;</code>
<code> </code><code>public</code> <code>function</code> <code>set</code> <code>HP_view( value : </code><code>int</code> <code>) : </code><code>void</code>
<code> </code><code>{</code>
<code> </code><code>trace</code><code>(</code><code>"HP_view 的值發生了改變 "</code> <code>+ _hp_view + </code><code>" -> "</code> <code>+ value );</code>
<code> </code><code>this</code><code>._hp_view = value;</code>
<code> </code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>function</code> <code>UserView( user : User )</code>
<code> </code><code>super</code><code>();</code>
<code> </code><code>this</code><code>.user = user;</code>
<code> </code><code>//綁定屬性 ----------------------------------------------------------</code>
<code> </code><code>// this -> 本類</code>
<code> </code><code>// HP_view -> 本類需要與user類(第三個參數)中HP屬性映射的屬性</code>
<code> </code><code>// user model類</code>
<code> </code><code>// HP</code>
<code> </code><code>// true 是否用HP初始化HP_view</code>
<code> </code><code>BindTools.bindProperty( </code><code>this</code> <code>, </code><code>"HP_view"</code> <code>, user , </code><code>"HP"</code> <code>, </code><code>true</code> <code>);</code>
<code> </code><code>//綁定回調方法--------------------------------------------------------</code>
<code> </code><code>// this._user_state_callback 回調方法</code>
<code> </code><code>// State 需要監聽的user的屬性</code>
<code> </code><code>// true 是否初始化調用_user_state_callback</code>
<code> </code><code>BindTools.bindSetter( </code><code>this</code><code>._user_state_callback , user , </code><code>"State"</code> <code>, </code><code>true</code> <code>);</code>
<code> </code><code>private</code> <code>function</code> <code>_user_state_callback( value : </code><code>uint</code> <code>) : </code><code>void</code>
<code> </code><code>trace</code><code>(</code><code>"State回調 得到的值為 :"</code> <code>+ value );</code>
<code> </code><code>}</code>
<code>}</code>
測試:
<code>package</code>
<code> </code><code>import</code> <code>com.User;</code>
<code> </code><code>import</code> <code>com.UserView;</code>
<code> </code><code>public</code> <code>class</code> <code>BindTest_AS </code><code>extends</code> <code>Sprite</code>
<code> </code><code>public</code> <code>function</code> <code>BindTest_AS()</code>
<code> </code><code>var</code> <code>user : User = </code><code>new</code> <code>User();</code>
<code> </code><code>var</code> <code>view_sprite : UserView = </code><code>new</code> <code>UserView( user );</code>
<code> </code><code>this</code><code>.addChild( view_sprite );</code>
<code> </code><code>user.HP = </code><code>200</code><code>;</code>
<code> </code><code>user.State = </code><code>5</code><code>;</code>
<code> </code><code>trace</code><code>( </code><code>"user.HP"</code> <code>, user.HP );</code>
<code> </code><code>trace</code><code>( </code><code>"user.State"</code> <code>, user.State );</code>
結果:
<a href="https://s3.51cto.com/wyfs02/M02/9B/5A/wKiom1liLnywA2elAABgM_UxKH0572.png-wh_500x0-wm_3-wmp_4-s_2029712299.png" target="_blank"></a>
<a href="http://down.51cto.com/data/2366826" target="_blank">附件:http://down.51cto.com/data/2366826</a>
本文轉自Aonaufly51CTO部落格,原文連結: http://blog.51cto.com/aonaufly/1945719,如需轉載請自行聯系原作者