[学习笔记]Event与Bindable

Event:png46

1.事件派发 Dispatching

Flash.events.EventDispacher类提供了事件dispatch函数,如果需要dispatch事件,则应该考虑继承该类或其子类.如果不能继承该类,则应实现IEventDispatcher接口 

2.监听事件 Listening to Events

在监听事件时应首先考虑是否要使用weak referenced.如果事件监听与派发与监听函数有共同的生命周期,则可以使用strong referenced,在其他的大部分情况下,则应使用weak referenced.

Bindable的三种实现方式:

1.使用Event实现.

2.MXML中使用大括号实现.

3.AS中使用ChangeWatcher实现.

Event与Bindable举例:

image

有一个Person类:

view plaincopy to clipboardprint?

  1. package com.insprise   
  2. {   
  3. import flash.events.Event;   
  4. import flash.events.EventDispatcher;   
  5. import mx.events.PropertyChangeEvent;   
  6. public class Person extends EventDispatcher   
  7.     {   
  8. private var _name:String;   
  9. private var _age:int;   
  10. private var _desc:String;   
  11. /** 
  12.          * 构造函数 
  13.          */
  14. public function Person()   
  15.         {   
  16. super();   
  17.         }          
  18. /** 
  19.          * Get&Set Name SetName时dispatch一个PropertyChangeEvent事件 
  20.          */
  21.         [Bindable(event="propertyChange")]   
  22. public function get name():String {   
  23.             trace("Get name: " + _name);   
  24. return _name;   
  25.         }   
  26. public function set name(name_:String):void {   
  27. if(name_ == _name) {   
  28. return;   
  29.             }   
  30.             var old:String = this._name;   
  31. this._name = name_;   
  32.             trace("Set Name to: " + name_);   
  33.             dispatchEvent(PropertyChangeEvent.createUpdateEvent(this,"name",old,name_));   
  34.         }   
  35. /** 
  36.          * Get&Set age; age被Set的时候会dispatch一个ageChanged事件. 
  37.          */
  38.         [Bindable(event="ageChanged")]   
  39. public function get age():int {   
  40.             trace("Get age: " + _age);   
  41. return _age;   
  42.         }   
  43. public function set age(age_:int):void {   
  44. if(age_ == _age) {   
  45. return;   
  46.             }   
  47.             var old:int = this._age;   
  48. this._age = age_;   
  49.             trace("Set Age to: " + age_);   
  50.             dispatchEvent(new Event("ageChanged"));   
  51.         }          
  52. /** 
  53.          * Get&Set Desc;desc被set时会自动dispatch一个PropertyChangeEvent. 
  54.          */
  55.         [Bindable]   
  56. public function get desc():String {   
  57.             trace("Get desc: " + _desc);   
  58. return _desc;   
  59.         }   
  60. public function set desc(desc_:String):void {   
  61. if(desc_ == _desc) {   
  62. return;   
  63.             }   
  64.             var old:String = this._desc;   
  65. this._desc = desc_;   
  66.             trace("Set desc to: " + desc_);   
  67.         }              
  68.     }   
  69. }  

现在我们通过上面提到的三种方式实现Bindable:

1.使用Event Bindable:

view plaincopy to clipboardprint?

  1. import mx.events.PropertyChangeEvent;  
  2. import com.insprise.Person;  
  3. var person:Person = new Person();  
  4. /**
  5. * 监听PropertyChangeEvent与ageChanged事件
  6. */
  7. private function init():void {  
  8.     person.addEventListener("propertyChange",propertyChangeHandler);  
  9.     person.addEventListener("ageChanged",ageChangedHandler);  
  10. }  
  11. /**
  12. * 通过对PropertyChangeEvent.property判断是name还是desc被监听,更新屏幕
  13. */
  14. private function propertyChangeHandler(e:PropertyChangeEvent):void {  
  15. if(e.property == "name") {  
  16.         textArea_Name.text = e.newValue.toString();  
  17.     }else if(e.property == "desc") {  
  18.         textArea_Desc.text = e.newValue.toString();  
  19.     }else {  
  20. return;  
  21.     }  
  22.     trace("view: " + e.property + " Changed");  
  23. }  
  24. /**
  25. * set age之后更新屏幕
  26. */
  27. private function ageChangedHandler(e:Event):void {  
  28.     textArea_Age.text = String(person.age);  

2.MXML使用大括号:

view plaincopy to clipboardprint?

  1. <mx:textarea x="202" y="107" width="131" height="21" wordwrap="true" editable="false" id="textArea_Name" text="{person.name}">
  2. <mx:label x="142" y="158" text="Age:">
  3. <mx:textarea x="202" y="157" width="131" height="21" wordwrap="true" editable="false" id="textArea_Age" text="{person.age}">
  4. <mx:label x="142" y="215" text="Desc:">
  5. <mx:textarea x="202" y="214" width="131" height="71" wordwrap="true" editable="false" id="textArea_Desc" text="{person.desc}">
  6. </mx:textarea></mx:label></mx:textarea></mx:label></mx:textarea>

3.使用AS中的ChangeWatcher

view plaincopy to clipboardprint?

  1. private function init():void {   
  2.     var nameWatcher:ChangeWatcher;   
  3.     var ageWatcher:ChangeWatcher;   
  4.     var descWatcher:ChangeWatcher;      
  5.     var canWatche:ChangeWatcher;   
  6. //nameWatcher = BindingUtils.bindProperty(textArea_Name,"text",person,"name"); 
  7.     ChangeWatcher.watch(person,"name",nameSetter);   
  8.     ageWatcher = BindingUtils.bindProperty(textArea_Age,"text",person,String("age"));   
  9.     descWatcher = BindingUtils.bindProperty(textArea_Desc,"text",person,"desc",true);   
  10. }   
  11. private function nameSetter(e:PropertyChangeEvent):void {   
  12. if(e==null) {   
  13. return;   
  14.     }   
  15.     textArea_Name.text = e.newValue.toString();   
  16.     trace("Name Changed by nameSetter on the Event " + e + " to " + e.newValue);   
  17. }   
  18. private function ageSetter(e:Event):void {   
  19. //textArea_Age.text = String(person.age); 
  20.     trace("Age is setted by ageSetter on the Event " + " to " + person.age);              

转载于:https://www.cnblogs.com/jiayuan/archive/2010/01/04/1638797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值