简化AS3的结合/事件派发code事件、code

2023-09-08 14:44:30 作者:两人始,一人终。

有3个属性(实施例1):

  [可绑定]公共变种名称:字符串;
[可绑定]公共变种的电子邮件:号码;
[可绑定]公共变种地址:布尔;
 

我需要有3个辅助方法,将绑定过(例如2):

  [可绑定]公共变种名称:字符串;
[可绑定]公共变种的电子邮件:号码;
[可绑定]公共变种地址:布尔;

公共职能得到nameIsOk():布尔{!返回Strings.isEmpty(名称)}
公共职能得到emailIsOk():布尔{回复邮件== 3}
公共职能得到addressIsOk():布尔{返回地址}
 
vscode简体中文插件 CSDN

当然,code以上不起作用。我做了做这个(例如3)工作:

 私人变种_name:字符串
[可绑定(nameChanged)]
公共职能得到名字():字符串{返回_name}
公共功能集名称(V:字符串):无效{_name = V;则dispatchEvent(新的事件(nameChanged))}
[可绑定(nameChanged)]
公共职能得到nameIsOk():布尔{!返回Strings.isEmpty(名称)}

私人VAR _EMAIL:号码
[可绑定(emailChanged)]
公共职能接收电子邮件():数量{返回_EMAIL}
公共职能设置电子邮件(V:编号):无效{_EMAIL = V;则dispatchEvent(新的事件(emailChanged))}
[可绑定(emailChanged)]
公共职能得到emailIsOk():布尔{回复邮件== 3}

私人VAR _address:布尔
[可绑定(addressChanged)]
公共职能的get()的地址:布尔{返回_address}
公共职能设置地址(V:布尔):无效{_address = V;则dispatchEvent(新的事件(addressChanged))}
[可绑定(addressChanged)]
公共职能得到addressIsOk():布尔{返回地址}
 

它的工作,但现在却是臃肿。

有没有办法减少这种code(例如3),以更小的东西(如例2)?

更新: 荣誉对just_a_dude了很好的答案。这里是最后的版本:

  [可绑定]公共变种名称:字符串;
[可绑定]公共变种的电子邮件:号码;
[可绑定]公共变种地址:布尔;

公共职能混音(){
    每个(VAR F:字符串中Strings.split(名电子邮件地址)){
        ChangeWatcher.watch(这一点,楼的onChange)
    }
}

私有函数的onChange(E:的PropertyChangeEvent):无效{
    则dispatchEvent(新的事件(e.property +更改))
}

[可绑定(nameChanged)]
公共职能得到nameIsOk():布尔{!返回Strings.isEmpty(名称)}

[可绑定(emailChanged)]
公共职能得到emailIsOk():布尔{回复邮件== 3}

[可绑定(addressChanged)]
公共职能得到addressIsOk():布尔{返回地址}
 

解决方案

不知道这是你要找的,但你可以使用mx.binding.utils.ChangeWatcher来看的属性更改

 < XML版本=1.0编码=UTF-8&GT?;
 

 < MX:脚本>
<![CDATA [
进口mx.events.PropertyChangeEvent;
进口mx.binding.utils.ChangeWatcher;


[可绑定]公共变种姓:字符串;
[可绑定]公共变种的电子邮件:号码;
[可绑定]公共变种地址:布尔;

私人VAR _watcher:返回ChangeWatcher;

私有函数的init():无效{
ChangeWatcher.watch(这一点,名字,propertyChangeHandler);
ChangeWatcher.watch(这一点,电子邮件,propertyChangeHandler);
ChangeWatcher.watch(这一点,地址,propertyChangeHandler);

的firstName =富;
电子邮件= 0;
地址= TRUE;

的firstName =酒吧;
电子邮件= 1;
地址= FALSE;
}

保护功能propertyChangeHandler(事件:PropertyChangeEvent中):无效{

VAR道具:对象= event.property;
VAR参数name:String = prop.toString()+改变;

//跟踪(姓名); //显示firstNameChanged或emailChanged或addressChanged

则dispatchEvent(新的事件(名称));
}


]]≥
< / MX:脚本>
 

让我知道,如果这有助于

干杯

There are 3 properties (example 1):

[Bindable] public var name:String;
[Bindable] public var email:Number;
[Bindable] public var address:Boolean;

I needed to have 3 helper methods that will be bindable too (example 2):

[Bindable] public var name:String;
[Bindable] public var email:Number;
[Bindable] public var address:Boolean;

public function get nameIsOk():Boolean     { return !Strings.isEmpty(name) }
public function get emailIsOk():Boolean    { return email == 3 }
public function get addressIsOk():Boolean  { return address }

Sure, the code above doesn't work. I made it work by doing this (example 3):

private var _name:String
[Bindable("nameChanged")]
public function get name():String       { return _name }
public function set name(v:String):void { _name = v; dispatchEvent(new Event("nameChanged")) }
[Bindable("nameChanged")]
public function get nameIsOk():Boolean  { return !Strings.isEmpty(name) }

private var _email:Number
[Bindable("emailChanged")]
public function get email():Number       { return _email }
public function set email(v:Number):void { _email = v; dispatchEvent(new Event("emailChanged")) }
[Bindable("emailChanged")]
public function get emailIsOk():Boolean  { return email == 3 }

private var _address:Boolean
[Bindable("addressChanged")]
public function get address():Boolean       { return _address }
public function set address(v:Boolean):void { _address = v; dispatchEvent(new Event("addressChanged")) }
[Bindable("addressChanged")]
public function get addressIsOk():Boolean  { return address }

It does work, but now it is bloated.

Is there a way to reduce this code (example 3) to something smaller (like example 2)?

UPDATE: Kudos to just_a_dude for nice answer. Here is the final version:

[Bindable] public var name:String;
[Bindable] public var email:Number;
[Bindable] public var address:Boolean;

public function Remixer() {
    for each (var f:String in Strings.split("name email address")) {
        ChangeWatcher.watch(this, f, onChange)
    }
}

private function onChange(e:PropertyChangeEvent):void {
    dispatchEvent(new Event(e.property + "Changed"))
}

[Bindable("nameChanged")]
public function get nameIsOk():Boolean  { return !Strings.isEmpty(name) }

[Bindable("emailChanged")]
public function get emailIsOk():Boolean  { return email == 3 }

[Bindable("addressChanged")]
public function get addressIsOk():Boolean  { return address }

解决方案

Not sure if this is what you're looking for but you can use mx.binding.utils.ChangeWatcher to "watch" for property changes

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
	<![CDATA[
		import mx.events.PropertyChangeEvent;
		import mx.binding.utils.ChangeWatcher;


		[Bindable] public var firstName:String;
		[Bindable] public var email:Number;
		[Bindable] public var address:Boolean;

		private var _watcher:ChangeWatcher;

		private function init():void {
			ChangeWatcher.watch(this, "firstName", propertyChangeHandler);
			ChangeWatcher.watch(this, "email", propertyChangeHandler);
			ChangeWatcher.watch(this, "address", propertyChangeHandler);

			firstName = "foo";
			email = 0;
			address = true;

			firstName = "bar";
			email = 1;
			address = false;
		}

		protected function propertyChangeHandler(event:PropertyChangeEvent):void {

			var prop:Object = event.property;
			var name:String = prop.toString() + "Changed";

			// trace(name); // displays firstNameChanged or emailChanged or addressChanged

			dispatchEvent(new Event(name));
		}


	]]>
</mx:Script>

Let me know if this helps

Cheers