[原] flex绑定, 我真的懂了吗? - 第二部分:不给力的ObjectProxy

[本文原创链接: http://www.smithfox.com/?e=96 , 转载请保留此声明, 谢谢!!]

在第一部分, 我学习了IPropertyChangeNotifier, 这个接口的SDK source code注释上说, 遇到复杂的情况, 用ObjectProxy.因为ObjectProxy 继承自 flash.utils.Proxy, 所以就有神奇的能力: 通过几个函数的重载, 可以拦截所有原生数据类型成员变量的变化!, 一来我们不用象第一部分示例代码一样写太多类似和重复的代码, 二来在拦截函数(比如setProperty)中我们就有机会实现相应要求, 而不用对原来的类做任何改动! 不过我想强调这些功能不是ObjectProxy的功劳, 而是Proxy.

在我用过ObjectProxy和看过它的代码后, 我的结论是ObjectProxy不给力!! 为什么不给力, 如果你没有兴趣看下面的详细分析, 你可以直接看文章最后的结论.

ObjectProxy问题及分析:

1. 只能处理当前所代理类的直接属性, 不能感知nested field property变化, 这明显和它声明实现IPropertyChangeNotifier接口是不符的.

见下面例子:

package
{
	//最简单的类
	public class A {
		//一个基本的成员变量
		public var field1:String;

		//A类包含了一个类型为B类的成员变量b, 
		//作为A的ObjectProxy也应该包括 b 的成员变量的变化
		public var b:B;
		
		public function A(){
			b = new B();
		}
	}
}

B类的定义如下:

package
{
	//也是一个简单的类
	public class B {
	  //这里定义的成员变量名字故意和A类的成员变量名字一样
	  //并且故意加了一个初始化值
		public var field1:String = "uuuu";
	}
}

测试主mxml程序

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   initialize="application1Init(event)"
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			import mx.events.PropertyChangeEvent;
			import mx.utils.ObjectProxy;
			import mx.utils.StringUtil;
			
			private var a:A = new A();
			private var _proxy:ObjectProxy;

			protected function application1Init(event:FlexEvent):void
			{
				_proxy = new ObjectProxy(a);
				_proxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
			}
			
			protected function updateHandler(event:PropertyChangeEvent):void
			{
				var tracelog:String = StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3})",
					event.kind,
					event.property,
					event.oldValue,
					event.newValue);
				trace(tracelog);
				log.appendText(tracelog);
				log.appendText("\n\n");
				/*
				if(event.property == "v1"){
					//trace("change v1");
					this.dispatchEvent(new Event("myValueChanged"));
				} else if(event.property=="bv"){
					//trace("change b.bv");
					this.dispatchEvent(new Event("myValueChanged"));
				}
				*/
			}

			protected function test1(event:MouseEvent):void{
				_proxy.field1 = "a.field1_"+Math.round(Math.random()*100);
			}

			protected function test2(event:MouseEvent):void {
				_proxy.b.field1 = "a.b.field1_"+Math.round(Math.random()*100);
			}

		]]>
	</fx:Script>
	<s:TextArea id="log" x="10" y="10" height="179" width="325"/>
	<s:Button label="change proxy(a).field1" x="9" y="197"   click="test1(event)" />
	<s:Button label="change proxy(a).b.field1" x="188" y="197" click="test2(event)"/>
	<s:Button x="10" y="226" label="clear log" click="log.text='';"/>
</s:Application>

运行如下:

如果你看不到flash, 你就直接到 http://www.smithfox.com/myopensource/testbinding/testobjectproxy.swf

你会发现click右边的button改变proxy(a).b.field1的值, 并不能触发相应的PropertyChangeEvent事件.

经过我的调试分析发现了原因: 这是因为在ObjectProxy中有这样的条件判断:

if (getQualifiedClassName(_item) == "Object")

当_item是 a.b 的时候, getQualifiedClassName(_item)返回的值其实是 "B", 也就是 b的实际类型, 并不是"Object".

不清楚这是否是一个bug.

2. 为了绕过上面问题, 我们可以故意将A,B直接在mxml中声明和定义, 这是为了展现另外一个问题: ObjectProxy dispatcher的PropertyChangeEvent事件中的property属性不支持complex field表达. 发现这个问题的人不止我一个人, 大家可以到 http://artlee.biz/461 看具体的例子.  简单来说就是:

proxy(a).field1="xx";和 proxy(a).b.field1="xx", 所引发的PropertyChangeEvent事件的property都是"field1", 这样我们就区分不了到底是a.field1变化了呢, 还是a.b.field1发生了变化, 理想情况应该是改变proxy(a).b.field1时的事件的property为 "b.field1".

知道了上面两点问题的原因, 我就自己写了一个MyObjectProxy: 在这里和大家share一下: 下载MyObjectProxy.as

但是我还发现有第三个可能也是问题, 这个问题我没有时间去深入研究, 在这里说一下.

可能是问题的第三点:

IPropertyChangeNotifier接口发布PropertyChangeEvent事件的前提是会判断当前对象是否有propertyChange事件的侦听器, 如果没有就不会发布, 这肯定是出于效率的考虑. ObjectProxy也会为所有nested field加上propertyChange侦听器, 但在dispatcher PropertyChangeEvent时没有任何hasEventListener的判断, 意思着nested field的所有属性的变化, 都会向外发布PropertyChangeEvent事件, 即使是外部没有任何侦听器.

至此, 可以得出一个结论: ObjectProxy只适合为flat class做proxy, 而不适合有nested field的类.

这样的话, 我们还不如直接在flat类的头上加 [Bindable], 那样更加直接和简单, compiler会自动地为每个属性生成PropertyChange事件触发机制.

[本文原创链接: http://www.smithfox.com/?e=96 , 转载请保留此声明, 谢谢!!]

smithfox | Sunday 06 March 2011 at 2:32 pm | | UI        | Used tags: , ,

five comments

Chanel iPhone 6 Cases

After using the iOS 8.3 update for three weeks and the iPhone 6 since its release back in September I can confidently say that iOS 8.3 delivers the best performance of any iOS 8 update I’ve used.

Chanel iPhone 6 Cases, (URL) - 23-04-’15 14:36
entretien ménager rive nord

entretien ménager rive nord, service de femme de ménage
Professionnelle de l’entretien, notrde dynamique entreprise saura réaliser pour vous l’ensemble des travaux ménagers.

G.E.M. s’engage sur une prestation de qualité !

Notre équipe de spécialistes chevronnés accomplira un travail à
la fois soigné, rapide et économique.
De plus, nous utilisons exclusivement des produits écologiques et hautement performants, issus dess toutes dernières technologies.

La vie moderne véhicule aussxi de lourdes menaces.

D’apparence inoffensive, meubles, appareils ménagers, matériaux de construction, jouets ou objets familiers peyvent dégager
des phtalates ou autrtes redoutables composés chimiques.

entretien ménager résidentiel
Franchise de Nettoyage Résidentiel et Commercial, service de femme de
ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Nous aidons les personnes désireuses d’être propriétaires
d’entreprises prospères à devenir des professionnels du
nettoyage commerrcial et de la maintenance.
En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide apportée par
un modèle d’affaires éprouvé vous assurant de travailler avec un leader du domaine disposant de l’expérience et la stabilité.

Vous disiez augmentez vos revenus afin d’améliorer votre
quotidien ? Faityes Appel a G.E.M Ménage!
service dee femme de ménage ,entretien ménager commercial,entretien ménager commercial,
ménage résidentiel, service d’entretien ménager montréal, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel,service
d’entretien ménager montréal
Franchises de Nettoyage Résidentiel et Commercial disponible Partout A Montréal
,Rive Nord et Rive Sud.

Financement Sans Intérêt par G.E.M .
Un dépôt est obligatoire

Un Investissement de 24 000$ Vous Rapporte (4800$ et plus de Revenus par Mois)!

Matériel et formation fourni

Nous aidons les personnes désireuses d’être
propriétaires d’entreprises prospères à devenir des professionnels du nettoyage commercial et de la maintenance.
En rejoignant notre réseau d’entreprises, vous bénéficierez
d’un avantage concurrentiel ainsi que d’une aide apportée par un modèle
d’affaires éprouvé vus assurant de travailer abec un leadder du domaine disposant de l’expérience et la stabilité.

G.E.M Ménage vous offre l’opportunité de travailler pendant la journée de lundi a vendredi .

G.E.M Vous propose des contrats d’entretien ménager avec des
horaiures souples et un revenu garanti.

Pour les personnes libres,les nouveaux arrivants ou les sans-emplois
G.E.M peut favoriser votre accès au marché ddu travail !

G.E.M vous proposee des cojtrats stables et rémunérateurs!

Dans le secteur résidentiel idéal pour unn couple, ou
un homme seul dans le secteur commercial
Vous débuter des maintenant

Des techniques et méthodes de travail éprouvées.
Une aide à la constitution ou à l’enregistrement dee leur entreprise.

Des territoires d’exercice protégés.
Entreprise clés en main.
Un garantie qui protège votre investissement

Exigences de l’entrée de notre réseau :
Les demandes sont examinées attentivemdnt et une enquête relative à
la candidature est menée.
Les candidats doivent passer une entrevue de sélection.
Avant tout début d’activité, les candidats doivent assister
à des sessions de formation.

Au G.E.M. nous nous assuronss que nos franchisés puissent offrrir à leurs clients uun service professionnel d’une qualité supérieure à celle
de la concurrence.
Franchise disponible au résidentiel et commercial

N’hésitez pas à nou contacter
469 Jean-Talon Ouest Suite # 222
Montreal QC
gemmenage.net
gemmenage.com

entretien ménager rive nord, (URL) - 14-07-’17 12:18
Service Entretien MéNager RéSidentiel Montreal  Rive Nord Et Rive Sud

service de femme de ménage
Professionnelle de l’entretien, notre dynamique entreprise saura réaliser pour vous l’ensemble
ddes travaux ménagers.
G.E.M. s’engage sur une prestation dee qualité !
Notre équipe de spécialistes chevronnés accomplira un travail
à laa fois soigné, rapide et économique.
De plus, nous utilisons exclusivement dees produits écologiques et hautement performants, issus des toutes dernières technologies.

La vvie moderne véhicule aussi dee lourdes menaces. D’apparence inoffensive, meubles, appareils ménagers,
matériaux de construction, jouets ou objets familiers peuvent dégager des phtazlates
ou autres redoutables composés chimiques.
entretien ménager résidentiel
Franchise de Nettoyage Résidentiel et Commercial, service dee femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Nous aidons les personnes désireuses d’être propriétaires
d’entreprises prospères à devenir des professionnels du
nettoyage commercial et de la maintenance. En rejoignant
notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainxi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant
de travailler avec un leader du domaine disposant de l’expérience et la
stabilité.
Vous disiez augmentez vos revenus afin d’améliorer
votre quotidien ? Faites Appel a G.E.M Ménage! service
de femme de ménage ,entretien ménager commercial,
entretienménager commercial, ménage résidentiel, service
d’entretien ménager montréal, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Franchises de Nettoyage Résidentiel et Commercial disponible Partout A Montréal ,Rive Nord et Rive Sud.

Financement Sans Intérêt par G.E.M .
Un dépôt est obligatoire

Un Investissement de 24 000$ Vous Rapporte (4800$ et
plis de Revenus par Mois)!

Matériel et formation fourni

Nous aidons lles personnes désireuses d’être propriétaires d’entreprises prospères
à devenir des professionnels du nettoyage commercial et de la maintenance.
En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une
aide apportée par un modèle d’affaires éprouvé vous assurant de travailler avec un leader du domaiine disposant de l’expérience et la stabilité.

G.E.M Ménage vous offre l’opportunité dde travailler pendant la journée
de lundi a vendredi .

G.E.M Vous propose dess contrats d’entretien ménager avec des horaires souples
et un revenu garanti.

Pour less personnes libres,les nouveaux arrivants ou les sans-emplois
G.E.M peut favoriser votre accès au marché du travail !

G.E.M vous propose des contrats stables et rémunérateurs!

Danns le secteur résidentiel idéal pour un couple, ou un homme seul dans
le secteur commercial
Vous débuter des maintenant

Des techniques et méthodes de travail éprouvées.
Une aide à lla constitution ou à l’enregistrement de leur entreprise.

Des territoites d’exercice protégés.
Entreprise clés en main.
Un garantie qui protège votre investissement

Exigences de l’entrée de notre réseau :
Les demandes sont examinées attentivement et une enquête relative à la candidature est
menée.
Les candidats doivent passer une entrevue de sélection.
Avant tout début d’activité, les candidats doivent assister à dess sessions de formation.

Au G.E.M. nous nous assurons qque nos franchisés puissent
offrir à leurs clients un service prkfessionnel d’une qualité supérieure à
celle de la concurrence.
Franchise disponible au résidentiel et commercial

N’hésitez pas à nous contacter
469 Jean-Talon Ouest Suite # 222
Montreal QC
gemmenage.net
gemmenage.com

Service Entretien MéNager RéSidentiel Montreal Rive Nord Et Rive Sud, (URL) - 01-08-’17 21:18
nettoyage montreal résidentiel

servce de femme de ménage
Professionnelle de l’entretien, notte dynamique entreprise saura réaliser pour vous l’ensemble des travaux ménagers.

G.E.M. s’engage sur une prestation de qualité !
Notre équipe de spécialistes chevronnés accomplira un travail à lla fois soigné, rapide et économique.

De plus, nous utilisons exclusivement des produits écologiques et hautement performants, iissus des toutes dernières technologies.

La vie moderne véhicule aussi de lourdes menaces. D’apparence inoffensive,
meubles, appareils ménagers, matériaux de construction,
jouets ou objets familiers peuvent dégager des phtalates ou autres
redoutables composés chimiques.
entretien ménager résidentiel
Franchise de Nettoyage Résidentiel et Commercial, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à devenir dess professionnels du nettoyage commercial et
dee la maintenance. En rejoignant notre réseau d’entreprises, vous bénéficierez
d’un avantae concurrentiel ainsi que d’une aide apportée par
un modèle d’affaires éprouvé vous assurant de travailler avec un leader duu domaine disposant de l’expérience
et la stabilité.
Vous disiez augmentez vos revenus afin d’améliorer votre quotidien ?

Faites Appel a G.E.M Ménage! service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal,
service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service
d’entretien ménager montréal
Franchises de Nettoyage Résidentiel et Commercial disponible Partouut
A Montréal ,Rive Noord et Riive Sud.

Financement Sans Intérêt ppar G.E.M .
Un dépôt est bligatoire

Un Investissement de 24 000$ Vous Rapporte (4800$
et plus de Revenus paar Mois)!

Matériel et formation fourni

Noous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à devenir des
professionnels du nettoyage commercal et de la maintenance.
En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant de travaillr avec
un leader du domaine disposant de l’expérience et la
stabilité.

G.E.M Ménage vous offre l’opportunité dee travailler pendant la
journée de lundi a vendredi .

G.E.M Vouss propose des ontrats d’entretien ménager avec des horaires
souples et un revenu garanti.

Pour les personnes libres,les nouveaux arrivants ou lles sans-emplois G.E.M peut favoriser
votre accès au marché du travail !

G.E.M vous propose des cntrats stables et rémunérateurs!

Dans le secteur résidentiel idéal pour un couple,
ou un homme seul dans le secteur commercial
Vous débuter des maintenant

Des techniques et méthodes de travail éprouvées.

Une aide à la constitution ou à l’enregistrement de leur entreprise.

Des territoires d’exercice protégés.
Entreprise clés en main.
Un garantie qui protège votre investissement

Exigencds de l’entrée de notre réseau :
Les demandes sont examinées attentivement et une enquête relative à laa candidature est
menée.
Les candiats doivent passer une entrevue de sélection.
Avant tout début d’activité, les candidats dlivent assister à des sessions de
formation.

Au G.E.M. nous nous assuroons que nos franchisés pyissent offrir à leurs clients un service
professionnel d’une qualité supérieure à celle dee la concurrence.

Franchise disponible au résidentiel et
commercial

N’hésitez pas à nous contacter
469 Jean-Talon Oueset Suite # 222
Montreal QC
gemmenage.net
gemmenage.com

nettoyage montreal résidentiel, (URL) - 04-08-’17 13:01
service entretien ménager résidentiel et commercial montreal rive nord et rive sud

service de femme de ménage
Professionnelle de l’entretien, notre dynamique
entreprise saura réaliser pour vou l’ensemble ddes travaux ménagers.

G.E.M. s’engage sur une prestation de qualité !

Notre équipe de spécialistes chevronnés accomplira un travail à la fois soigné,
rapide et économique.
De plus, nous utilisons exclusivement des produits
écologiques eet hautement performants,issus des touyes dernières technologies.

La vie moderne véhicule aussi de lourdes menaces.
D’apparence inoffensive, meubles, appareils ménagers, matériaux de construction, jouets
ou objnets familiers peuvent dégager des phtalates ou autres redoutables composés chimiques.

entretien ménager résidentiel.G.E.M votre uniique intervenant qui pourra
assurer tout au long de l’année la continuité d’un service de haute qualité eet à la carte !

Entretien ménager résidentiel, Entretien ménager commercial, Grad ménage résidentiel et commercial, Lavage de Vitres, Lavage
de tapis, Décapage et Cirage de planchers et Plus.

Franchise de Nettoyage Résidentiel et Commercial, service de femme dde ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à devenir des professionnels du nettoyage commercial et de la
maintenance. En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage clncurrentiel
ainsi que d’une aide apportée par un modèle
d’affaires éprouvé vous assurant de travailler avec un leader du domaine disposant de l’expérience et la stabilité.

Vous disiez augmentez vos revenus afin d’améliorer votre quotidien ?
Faites Appel a G.E.M Ménage! service de femmee de ménage ,entretien ménager commercial,entretien ménager commercial, ménage
résidentiel, service d’entretien ménager montréal, service de femme de ménage
,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal
Franchises dde Nettoyage Résidentiel et Commercial disponible Partout A Montréal ,Rive Nord eet Rive Sud.

Financement Sans Intérêt par G.E.M .
Un dépôt est obligatoire

Un Investissement de 24 000$Vous Rapporte (4800$ et plus
de Revenus par Mois)!

Matériel et formation fourni

Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères
à devvenir des professionnels du nettoyage commercial et
de la maintenance. En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant dee travailler avec un leader
du domaine disposant de l’expérience et la stabilité.

G.E.M Ménage vous offre l’opportunité de travailler pendant la
journée de lundi a vendredi .

G.E.M Vous propose des contrats d’entretien ménager avec des horaires souples et un revenu garanti.

Pour les personnes libres,les nouveaux arrivants ou les sans-emplois G.E.M put favoriser votre accès au marché du travail !

G.E.M vous propose des contrats stables et rémunérateurs!

Dans le scteur résidentiel idéal pour un couple, ou un homme sul dans le
secteur commercial
Vous débuter des maintenant

Des techniques et méthodes de travakl éprouvées.

Une aide à la constitutoon ou à l’enregistrement de leur entreprise.

Des territoires d’exercice protégés.
Entreprise clés en main.
Un garantie qui protège votre investissement

Exigences dde l’entrée de notre réseau :
Les demandes sont examinées attentivement et une enquête relative à la candidature est menée.

Les candidats doivent passer une entrevue de sélection.
Avant tout début d’activité, les candidats doivent assister à des sessions de formation.

Au G.E.M. nous nous assurons qque nos franchisés puissent offrir à
leurs clients un service professionnel d’une qualité
supérieure àcelle de la concurrence.
Franchise disponible au résidentiel et commercial

N’hésitez pas à nous contacter
469 Jean-Talon Ouest Suite # 222
Montreal QC
gemmenage.net
gemmenage.com

service entretien ménager résidentiel et commercial montreal rive nord et rive sud, (URL) - 14-08-’17 07:31
(optional field)
(optional field)
为阻止垃圾广告, 请在提交评论前, 回答一个简单问题(Please answer an simple question)
Remember personal info?
Notify
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.