天天看點

AS3 屬性綁定

縱然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>" -&gt; "</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 -&gt; 本類</code>

<code>   </code><code>// HP_view -&gt; 本類需要與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,如需轉載請自行聯系原作者

繼續閱讀