纵然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
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 );
}
}
}
|
结果:
附件:http://down.51cto.com/data/2366826
本文转自Aonaufly51CTO博客,原文链接: http://blog.51cto.com/aonaufly/1945719,如需转载请自行联系原作者