2009-06-01 13 views
0

純粋なASにMXMLアイテムレンダラーを書き直しています。過去には見えない問題は、アイテムレンダラーがアイテムレンダラークラスの静的プロパティの変更に反応する方法です。 MXMLのバージョンでは、私は以下をアイテムレンダラーに設定されているバインディング:静的プロパティの変更に反応する

instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)} 

ASでこれを設定するのと同等の方法だろう何(BindingUtilsを使用して、私は仮定しますか)?

UPDATE:
だから私は、次のように働いていなかったが、FlexがinstanceFunctionでスローされたエラーを抑制しているかのように表示され、それ自身結合が悪いかのように見せることを考えました。特定のインスタンス上

BindingUtils.bindSetter(instanceFunction, ItemRenderer, "staticProperty"); 

instanceFunctionが呼び出されたときしかし、すでに初期化された変数は、上記に参照し、エラーの原因となったすべてのNULL、です。これはなぜですか?

答えて

2

あなたは私が知っ2つのオプションがあります:あなたはそれは、静的プロパティへの結合をどのように処理するかを見るためにあなたのMXMLに基づくFlexコンパイラのビルドコードに掘ることができる

オプション1 を。 -keep-generated-actionscriptというコンパイラ・ディレクティブがあり、生成されたファイルをスティックさせます。これらをスルーすると、何が起こるかを知ることができます。このオプションは、BindingオブジェクトとStaticPropertyWatcherオブジェクトのインスタンス化を伴います。

オプション2 この記事http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.htmlを参照してください静的変数を含むクラスにビルド時に追加されるstaticEventDispatcherオブジェクトがあります。ポストによると、このオブジェクトは、静的変数の存在に基づいて追加されるだけで、ゲッター関数ではありません。 オプション2の

例は、我々はいつでもMyStaticVariable変更を更新取得したいMyStaticVariableという名前の静的変数と他の変数someobject.somearraypropertyと名付けられたクラスMyClassContainingStaticVariableを持っていると言います。

Class(MyClassContainingStaticVariable).staticEventDispatcher.addEventListener(
PropertyChangeEvent.PROPERTY_CHANGE, 
function(event:PropertyChangeEvent):void 
{ 
    if(event.property == "MyStaticVariable") 
    { 
     someobject.somearrayproperty = event.newValue as Array; 
    } 
}); 
+0

nice! Flash BuilderはClass :: staticEventDispatcher()のオートコンプリートもしませんが、それは動作します – sydd

+0

ええ、参照されたポストに基づいて、私はそれがビルド時に追加されるので、実際にはコーディング中にオートコンプリートには利用できません。 – bingles

+0

@bingles非常に面白いもの!私は当然のように移動して以来、長いことをしてきましたが、それを掘り起こす素晴らしい仕事です。 – Stiggler

0

"PropertyChanged"イベントに応答する必要があると思います。

+0

少し詳しく教えてください。このイベントはどのように/いつディスパッチされますか? – Stiggler

0

これを行う場合は、静的ではなくシングルトンを使用します。私はそれが静的に動作するとは思わない。 (そういうやり方をしなければならない場合は、おそらくもう一度やり直すことができればよいでしょう)。

var instance:ItemRenderer = ItemRenderer.getInstance(); 
BindingUtils.bindProperty(this, "myProperty", instance, "theirProperty"); 
+0

申し訳ありませんが、私は別の方法を探していません。これはMXMLで動作するように見えるためです。舞台裏で起こっている仕事について私は疑問に思います。 – Stiggler

+0

さて、バインディングはプロパティのイベントリスナーを設定します。 EventDispatcherではないため、クラスオブジェクトを聴くことはできません。あなたのクラスがEventDispatcherを拡張し、あなたがシングルトンメソッドを使っていたなら、あなたはそれを行うことができます。シングルトンのように悪いので、スタティッククラスは最悪です。 MXMLでも動作するかもしれませんが、ほぼ確実にバインドされていません。一度値を見つけて、それ以降は決して更新しないかもしれません。 –

+0

私はあなたの時間を感謝しますが、私たちは同じページにいないようです。まず、ItemRendererのためにこれを行うことを考えています。クラスが複数のインスタンスを持ち、シングルトンの使用を直ちに排除することを意味します。第2に、静的なゲッター/セッターでない限り、静的なプロパティへのバインディングが許可されます。私がMXMLで設定したバインディングは、一度だけでなく100%時間で動作します。 – Stiggler

0

しばらくの間、これをいじるの後、私は、これは現在、ActionScriptでbindSetterでさえ可能ではないではないと結論づけています。データバインディングのいくつかのMXMLのみの機能が、Adobeのドキュメントから抜粋して判断しているようです(しかし、すべてがASコードにコンパイルされているわけではありません)。

あなたが関数または配列データ内のプロパティ鎖中 要素は、bindProperty()またはbindSetter()メソッドによって定義されたバインディング式を含めることはできません。 プロパティ チェーンの詳細については、バインド可能な プロパティチェーンの使用を参照してください。

出典:http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_7.html

0

あなたはfunciton呼び出しの中に立ってHostProxyクラスを作成することができます。 HostFunctionProxyクラスのようにProxyから拡張され、ホストからリモートで関数を呼び出すgetProperty("functionInvokeStringWithParameters")を持ち、典型的な[Bindable("change")] Proxyクラスのバインディングをトリガーする "change"イベントを送出します。

HostProxyクラスをホストとして動作させ、そのプロパティを使用してリモートから関数呼び出しをトリガーします。もちろん、TypeHelperUtilには、生の文字列値をメソッドパラメータの実行時に直列化された型の値に変換できるようにするほうがクーラーです(通常コンマで区切ります)。

例:

var standInHost:Object = new HostFunctionProxy(someModelClassWithMethod, "theMethodToCall(20,11)"); 
// With BindingUtils..... 
// bind host: standInHost 
// bind property: "theMethodToCall(20,11)" 

もちろん、基本的なFlexの処方以外の機能をサポートするために、このような機能を作成する必要はありません。このような(より高度な)Flexバインディングは、通常はコンパイル時に実行されるようですが、Flexフレームワークに依存することなく、実行時に完全にクロスプラットフォームのActionscriptでコードを作成する必要があります。

関連する問題