2009-06-01 2 views
0

Ich überschreibe einen MXML-Elementrenderer in reinem AS. Ein Problem, über das ich nicht hinwegzukommen scheint, ist, wie jeder Elementrenderer auf eine Änderung an einer statischen Eigenschaft in der Elementrendererklasse reagiert. In der MXML-Version, ich habe auf dem Elementrenderers einrichten die folgende Bindung:Reagieren, um auf einer statischen Eigenschaft zu ändern

instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)} 

Was die äquivalente Möglichkeit, dies in AS der Einrichtung (unter Verwendung von BindingUtils, nehme ich an) sein würde?

UPDATE:
Also dachte ich, folgende nicht funktioniert, aber es scheint, als ob Flex Fehler in der instanceFunction geworfen zu unterdrücken, so dass es scheint, als ob die Bindung selbst schlecht ist.

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

Wenn jedoch instanceFunction genannt wird, bereits initialisierten Variablen auf dem gegebenen Beispiel sind alle null, die die Ursache für die Fehler, die oben Bezug genommen wurde. Irgendwelche Ideen, warum das ist?

Antwort

2

Sie haben 2 Möglichkeiten, die mir bewusst bin:

Option 1 Sie können in den Code graben, dass die Flex Compiler auf Ihrem MXML basierend Builds zu sehen, wie es behandelt, um statische Eigenschaften zu binden. Es gibt eine Compiler-Direktive mit dem Namen -keep-generated-actionscript, die dafür sorgt, dass generierte Dateien bleiben. Sleuthing durch diese kann Ihnen eine Idee geben, was passiert. Bei dieser Option werden Binding-Objekte und StaticPropertyWatcher-Objekte instanziert.

Option 2 Es ist staticEventDispatcher Objekt, das bei der Erstellung zu Klassen mit statischen Variablen finden Sie in diesem Beitrag http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.html hinzugefügt wird. Laut dem Post wird dieses Objekt nur basierend auf dem Vorhandensein von statischen Variablen und nicht Getter-Funktionen hinzugefügt.

Beispiel für Option 2 sagen, wir haben eine Klasse namens MyClassContainingStaticVariable mit einer statischen Variablen mit dem Namen MyStaticVariable und eine andere Variable someobject.somearrayproperty, dass wir, wenn MyStaticVariable Änderungen erhalten aktualisiert werden soll.

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

schön! Flash Builder wird nicht automatisch für Class :: staticEventDispatcher() vervollständigt, aber es funktioniert – sydd

+0

Ja, basierend auf dem referenzierten Beitrag, denke ich, dass es zur Build-Zeit hinzugefügt wird, also nicht wirklich verfügbar für die automatische Vervollständigung während des Codierens. – bingles

+0

@bingles Sehr interessante Sachen! Ich bin natürlich schon lange weitergezogen, aber eine schöne Arbeit, die das aushöhlt. – Stiggler

0

Ich denke, Sie müssen auf das Ereignis "PropertyChanged" reagieren.

+0

Können Sie bitte ein wenig ausarbeiten? Wie/wann wird dieses Ereignis verschickt? – Stiggler

0

Wenn Sie das tun, verwenden Sie ein Singleton anstelle von statisch. Ich glaube nicht, dass es auf einem statischen funktioniert. (Wenn Sie es auf diese Weise tun müssen, gibt es wahrscheinlich ein paar Möglichkeiten, wie Sie das erneut angehen könnten, das wäre besser).

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

Sorry, aber ich suche keinen anderen Ansatz, weil dieser in MXML zu funktionieren scheint. Ich wundere mich über die Arbeit hinter den Kulissen. – Stiggler

+0

Nun, Bindung richtet Ereignis-Listener für die Eigenschaften ein. Sie können kein Klassenobjekt hören, weil es kein EventDispatcher ist. Sie könnten es tun, wenn Ihre Klasse EventDispatcher erweitert und Sie mit der Singleton-Methode gingen. So schlecht Singletons sein können, statische Klassen sind am schlimmsten. Es könnte in MXML funktionieren, aber es ist fast sicher nicht gebunden. Es könnte den Wert nur einmal finden und danach nie mehr aktualisieren. –

+0

Ich schätze Ihre Zeit, aber es scheint, wir sind nicht auf der gleichen Seite. Zuallererst möchte ich dies für einen ItemRenderer tun, was impliziert, dass die Klasse mehrere Instanzen haben wird, was den Einsatz eines Singleton sofort ausschließt, zum Guten oder zum Schlechten. Zweitens ist das Binden an statische Eigenschaften erlaubt, solange es kein statischer Getter/Setter ist. Die Bindung, die ich in MXML eingerichtet habe, funktioniert nicht nur einmal, sondern zu 100%. – Stiggler

0

Nachdem er eine Weile mit diesem Hantieren, ich habe festgestellt, dass dies zur Zeit in Actionscript nicht möglich ist, nicht einmal mit bindSetter. Es scheint, dass es nur einige MXML-Features von Datenbindungen gibt, die durch den folgenden Auszug aus den Adobe-Dokumenten beurteilt werden (obwohl es nicht sowieso alles nach AS-Code kompiliert ist)?

Sie können keine Funktionen oder Elemente in Array Eigenschaft Ketten in einem Daten umfassen Bindungsausdruck durch die bindProperty definiert() oder bindSetter() Methode. Weitere Informationen zur Eigenschaft Ketten finden Sie unter Arbeiten mit bindbaren -Objektketten.

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

0

Sie können eine HostProxy Klasse erstellen für den funciton Aufruf zu stehen. Sortieren wie eine HostFunctionProxy-Klasse, die vom Proxy ausgeht und über eine getProperty("functionInvokeStringWithParameters") verfügt, die die Funktion remote vom Host aufruft und ein "change" -Ereignis absetzt, um die Bindung in der typischen [Bindable("change")] Proxy-Klasse auszulösen.

Sie können die HostProxy-Klasse als Host verwenden und die Eigenschaft verwenden, um den Funktionsaufruf remote auszulösen. Natürlich wäre es cooler, wenn man TypeHelperUtil haben würde, um rohe Zeichenkettenwerte zur Laufzeit in serialisierte Typwerte für Methodenparameter umwandeln zu können (normalerweise durch Kommas getrennt).

Beispiel: z.

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

Natürlich nee Sie eine solche utlity um eine solche Funktionalität über die grundlegenden Flex Rezept zu helfen, zu unterstützen. Es scheint, dass viele dieser (fortgeschritteneren) Flex-Bindungen normalerweise zur Kompilierungszeit ausgeführt werden, aber jetzt müssen Sie Code erstellen, um dies zur Laufzeit in einer vollständig plattformübergreifenden Actionscript-Manier zu tun, ohne auf das Flex-Framework angewiesen zu sein.

Verwandte Themen