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

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 );
  }
 }
}

测试:

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 );
   
  }
 }
}

结果:

时间: 2024-11-04 20:08:54

AS3 属性绑定的相关文章

C# 属性绑定

C#的反射明显的比AS3的反射要强很多啊.可以从外部访问到类的私有成员.举个例子:                 Type _class = this.GetType();                 FieldInfo _field = _class.GetField(@fieldName, BindingFlags.Instance | BindingFlags.NonPublic); 枚举 : BindingFlags.NonPublic ->非公共成员将包括在内进行搜索,意思就是p

Vue.js学习笔记:属性绑定 v-bind

v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> 绑定HTML Class 一.对象语法: 我们可以给v-bind:class 一个对象,以动态地切换class.注意:v-bind:class指令可以与普通的class特

Ember.js 入门指南——handlebars属性绑定

本文从http://www.ibeginer.sinaapp.com迁移过来,欢迎访问原页面. 简单讲属性绑定其实就是在HTML标签内(是在一个标签的"<"和">"中使用)直接使用handlebars表达式.可以直接用handlebars表达式的值作为HTML标签中某个属性的值. 准备工作:ember generate route binding-element-attributes 1,绑定字符串 <!-- //  app/templates/b

【WPF】如何把一个枚举属性绑定到多个RadioButton

一.说明 很多时候,我们要把一个枚举的属性的绑定到一组RadioButton上.大家都知道是使用IValueConverter来做,但到底怎么做才好? 而且多个RadioButton的Checked和UnChecked都会触发绑定,这样就会调多次的Set. 二.目的 实现一个枚举属性绑定到多个RadioButton, 属性的Set方法不会被触发多次. 三.实现 方法大家都知道,就是利用Converter和ConevertParamter属性. 因为多个控件绑定一个属性,Checked和UnChe

使用注解属性绑定

大家应该知道在Spring中有一个注解@Value,他可以帮助我们来讲Spring加载的配置文件(*.perperties)文件中的信息自动的注入到我们的非静态属性中的. 一般情况下我们会这样使用: 1. 首先在Spring的配置文件中加载属性文件: ? 1 <context:property-placeholder location="classpath:component.properties"  ignore-unresolvable="true"/&g

qml中的属性绑定与赋值

浅谈qml属性绑定与赋值 属性赋值 就字面意思,赋一个值给属性 Rectangle { id:rect Component.onCompeleted:{ rect.width = 10; // 赋值 rect.height = 10; // 赋值 rect.color = "red"; // 赋值 } } 属性赋值时会发出信号,可以通过信号处理器,来为信号添加处理函数,关于信号处理器,也就是连接到同一个信号的槽函数的队列,每次为信号处理器书写处理函数时,并不会覆盖上一次书写的处理器,最

Knockoutjs实例 - 属性绑定(Bindings)之流程控制(Control flow)

一.foreach binding 使用此功能可以方便我们循环遍历输出某个数组.集合中的内容. (1).循环遍历输出数组 View Row Code 1 <script type="text/javascript" src="knockout-2.2.0.js"></script> 2   3 <table> 4      <thead> 5          <tr><th>First nam

xaml mvvm(2)之属性绑定

通过微软INotifyPropertyChanged接口,可以实现对UI实时更新,不管是数据源或者目标对象,可以实现相互通知. 下面我们根据INotifyPropertyChanged编写一个扩展类.该类是基于C#5.0特性,这里我们介绍一下System.Runtime.CompilerServices命名空间下的CallerMemberName特性,当RaisePropertyChanged的属性名称参数为空,而通过编译器可以智能加上,可以通过反编译工具知晓,这点改进这点很人性化.注:如果开发

属性绑定与赋值

首先看下面一段示例代码: 1 import QtQuick 2.4 2 import QtQuick.Controls 1.3 3 import QtQuick.Window 2.2 4 import QtQuick.Dialogs 1.2 5 6 Rectangle{ 7 id: root 8 width: 320 9 height: 320 10 color: "red" 11 opacity: 0.3 12 13 Text { 14 id: label 15 x: 20; y: