Flex-Warnung: Nicht zum binden an der Eigenschaft 'foo' auf 'Klasse ' Objekt' (eine Klasse nicht ein IEventDispatcher)
Ich habe ein Objekt, das enthält ein Dutzend oder so-Felder will ich binden, Formular-Elemente, so dass ich dieses Objekt zum senden der Daten an den server zurück gespeichert werden.
Definition meiner container-Objekt:
private static const emptyLink:Object = {
id: -1, title:'',
trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'',
linkTitle:'', linkBody:'',
answer1:'',answer2:'',answer3:'',answer4:'',answer5:''
};
[Bindable] public var currentLink:Object = emptyLink;
currentLink
zugeordnet ist, zur Laufzeit zu einem bestimmten index aus einer ArrayCollection, ich bin nur mit der emptyLink
- Objekt für die Initialisierung Zwecken, hauptsächlich.
<mx:Panel id="triggerPanel" title="Trigger" width="33%">
<mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" />
<mx:TextInput id="trigger2" width="100%" textAlign="left" text="{currentLink.trigger2}" />
<mx:TextInput id="trigger3" width="100%" textAlign="left" text="{currentLink.trigger3}" />
<mx:TextInput id="trigger4" width="100%" textAlign="left" text="{currentLink.trigger4}" />
<mx:TextInput id="trigger5" width="100%" textAlign="left" text="{currentLink.trigger5}" />
</mx:VBox>
</mx:Panel>
Natürlich, diese kompiliert und zeigt ganz gut, aber es sind Laufzeit-Warnungen für jede Instanz:
Achtung: nicht zum binden an der Eigenschaft 'trigger1' Klasse 'Objekt' (eine Klasse nicht ein IEventDispatcher)
Warnung: nicht zum binden an der Eigenschaft 'trigger2' Klasse 'Objekt' (eine Klasse nicht ein IEventDispatcher)
Warnung: nicht zum binden an der Eigenschaft 'trigger3' Klasse 'Objekt' (eine Klasse nicht ein IEventDispatcher)
Warnung: nicht zum binden an der Eigenschaft 'trigger4' Klasse 'Objekt' (eine Klasse nicht ein IEventDispatcher)
Warnung: nicht zum binden an der Eigenschaft 'trigger5' Klasse 'Objekt' (eine Klasse nicht ein IEventDispatcher)
Und die currentLink
- Objekt wird nicht aktualisiert, wenn die TextInput
Felder geändert werden.
Die offensichtliche Antwort ist, dass mein Objekt muss eine Instanz einer Klasse, die IEventDispatcher
. Was, die Antwort hat mir nicht zu sagen, ist, dass die Einzelheiten der Umsetzung dieser Schnittstelle (was ist erforderlich? was nicht?), und wenn es ein einfacher Weg, dies zu tun -- wie eine eingebaute Klasse, die gerne akzeptiert meine benutzerdefinierte Eigenschaften und damit für die Bindung, ohne mir sorgen darüber zu machen, dass die Einzelheiten der Implementierung der Schnittstelle.
Sieht so eine Klasse existiert? Wenn nicht, was ist das absolute minimum und/oder akzeptierten standard für die Erfüllung dieser Aufgabe?
InformationsquelleAutor der Frage Adam Tuttle | 2009-05-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ObjectProxy (wie Chetan erwähnt) - aber Sie braucht es auch ein valueCommit, um den text geben Sie in die Eingabe ZURÜCK in Ihr Objekt:
InformationsquelleAutor der Antwort Gabriel
Object
löst keine Ereignisse. Obwohl Sie sich vorgenommen haben, das variable Gebunden werden, die Eigenschaften des Objekts durch die variable referenziertencurrentLink
kann nicht gebunden werden.Verwenden
ObjectProxy
statt.InformationsquelleAutor der Antwort Chetan Sastry
Das erste, was Sie wissen wollen ist, dass die Bindung in Flex 3 ist nicht bidirektional. Die binding-Ausdrucks wird sichergestellt, dass, wenn die Quelle des verbindlichen Ausdruck (currentLink.trigger1) änderungen, die dem target (TextInput), erhalten die Mitteilung über die änderung, und aktualisieren Sie Sie entsprechend. Wenn Sie möchten, dass die Bindung zu gehen in die andere Richtung, es gibt mindestens zwei Möglichkeiten, dies zu tun:
In Flex 4 Sie sind Einführung eine neue syntax für die bidirektionale Bindung @{einige.die Bindung.Ausdruck} aber es ist nicht verfügbar in Flex 3.
Auf den 2. Teil: die Fehler, die Sie erhalten, ist, weil Sie die Bindung an eine "generische" Prototyp-Objekt. Wenn Sie das [Bindable] - Metadaten-tag, um eine Eigenschaft oder Klasse, der MXMLC-compiler generiert code, der die Nutzung der binding-Dienstprogramme und-Eigenschaft ändern watchers zu machen, die Bindung geschehen. Allerdings können Sie nicht machen, das Prototyp-Objekt dies tun, denn es ist ein built-in. Sie können erstellen Sie eine benutzerdefinierte ActionScript-Klasse, die bindbare (oder hat bestimmte Eigenschaften, die bindbar). Der MXMLC-compiler generiert eine Klasse, die die IEventDispatcher implementiert und unterstützt daher verbindlich. Dies hat den Vorteil, dass Sie schneller als die prototype-Objekte und gibt Ihnen auch compile-time-Prüfung, d.h. Sie erhalten einen compiler-Fehler, wenn Sie auf eine ungültige Eigenschaft.
Die andere alternative ist, wickeln Sie Ihren Prototyp in ObjectProxy-als einer der anderen Mitglieder vorgeschlagen hat.
InformationsquelleAutor der Antwort cliff.meyers
Nur ein Tipp wie man herausfinden kann, den fehlerhaften code in einem größeren Projekt setzen Sie einen Haltepunkt auf die beiden
Linien in der SDK PropertyWatcher Klasse (Navigieren > Open Type > ...). Stacktrace wird dann helfen, finden Sie die ui-Komponente, hält die Bindung gebrochen.
InformationsquelleAutor der Antwort Stepan
Im Allgemeinen, der Grund, warum man "nicht in der Lage, zu binden Eigenschaft foo in einer Klasse sind, ist, weil Sie entweder fehlen einer get-oder Set-Methode für foo. Sie könnte auch foo bezieht sich auf eine öffentliche variable, (obwohl dies bricht Kapselung)
So müssen Sie diese Beiden machen es Weggehen:
oder
InformationsquelleAutor der Antwort willedw
Hier ist der livedocs-Referenz für die Schnittstelle. Es ist ziemlich viel, was wäre offensichtlich.
Zitieren:
Daher
InformationsquelleAutor der Antwort dkretz
Habe ich noch nicht mit Flex für sehr lange, und diese vielleicht nicht deinen Anforderungen entspricht, aber warum nicht XML? Ich glaube, Sie können die TextInput-text Wert für Attribute in der XML.
Ich bin mit pseudo-code, aber sowas macht für mich Sinn:
So etwas, vielleicht?
InformationsquelleAutor der Antwort bedwyr