天天看点

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,如需转载请自行联系原作者

继续阅读