纵然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;
  }
}
}

假设 spacer.gifUserView.as需要监听 User的HP 和 State

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package 
com
{
 
import 
com.bind.BindTools;
  
 
import 
flash.display.Sprite;
 
/**
  
* 模拟一个窗口 , 当User中hp改变时 , 此窗口的相应值也会随之改变
  
*/
 
public 
final 
class 
UserView 
extends 
Sprite
 
{
     
private 
var 
user : User = 
null
;
   
  
private 
var 
_hp_view : 
int 
0
;
  
public 
function 
set 
HP_view( value : 
int 
) : 
void
  
{
   
trace
(
"HP_view 的值发生了改变  "  
+ _hp_view +  
" -> " 
+ value );
   
this
._hp_view = value;
    
  
}
   
  
public 
function 
UserView( user : User )
  
{
   
super
();
   
this
.user = user;
   
//绑定属性 ----------------------------------------------------------
   
// this -> 本类
   
// HP_view -> 本类需要与user类(第三个参数)中HP属性映射的属性
   
// user model类
   
// HP
   
// true 是否用HP初始化HP_view
   
BindTools.bindProperty( 
this 
"HP_view" 
, user , 
"HP" 
true 
);
    
   
//绑定回调方法--------------------------------------------------------
   
// this._user_state_callback 回调方法
   
// user model类
   
// State 需要监听的user的属性
   
// true 是否初始化调用_user_state_callback
   
BindTools.bindSetter( 
this
._user_state_callback , user , 
"State" 
true 
);
  
}
  
private 
function 
_user_state_callback( value : 
uint 
) : 
void
  
{
   
trace
(
"State回调 得到的值为 :" 
+ value );
  
}
 
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package
{
 
import 
com.User;
 
import 
com.UserView;
  
 
import 
flash.display.Sprite;
  
 
public 
class 
BindTest_AS 
extends 
Sprite
 
{
  
public 
function 
BindTest_AS()
  
{
   
var 
user : User = 
new 
User();
   
var 
view_sprite : UserView = 
new 
UserView( user );
   
this
.addChild( view_sprite );
   
user.HP = 
200
;
   
user.State = 
5
;
    
   
trace
"user.HP" 
, user.HP );
   
trace
"user.State" 
, user.State );
    
  
}
 
}
}

结果: