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