| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: May 2003
Beiträge: 1.031
| Verständnisfrage: Eigene MXML Komponente mit AS3 ansprechen
Hi, tolles Forum, ich hoffe hier kann mir jemand weiterhelfen. Ich habe eine Main Applikation, die in verschiedenen States verschiedene eigene Komponenten verwenden soll. D.h. eine Eingabemaske für Kundendaten steckt z.B. in einem eigenen State. Nun möchte ich aber nicht, dass ich in das MXML Dokument der Komponente die gesamte Logik schreibe, sondern für jede Komponente eine eigene AS Datei habe. Meine Hauptapplikation (Nur ein Menü, welches je nach Klick verschiedene States aufruft. Im State AddCustomers, steckt die Komponente "AddCustomers".) PHP-Code: PHP-Code: PHP-Code: Warum kann ich vom Action Script File der Komponente nicht auf die Felder in der Komponente zugreifen. Bzw. wie könnte ich im ActionScript File der Komponente auf die "Hauptbühne", also meine Main Applikation, zugreifen? Wie geht das? Grüße Christian |
| | |
| | #2 (permalink) |
| - Registriert seit: Jul 2003
Beiträge: 714
|
So wie ich das sehe erzeugst du eine MXML Komponente (lib.components.AddCustomers) . Code: <mx:Canvas> ... </mx:Canvas> Code: <mx:Script>
<![CDATA[
import lib.components.AddCustomersAS;
public var _AddCustomersAS:AddCustomersAS = new AddCustomersAS();
]]>
</mx:Script> Richtig? Wenn ja: So kann das nicht klappen. Die Klasse AddCustomersAS ist doch keine Unterklasse von AddCustomers, so dass ein Zugriff auf die Instanzvariabel der MXML - Komponente nicht möglich ist. Lösung 1 wäre das du die Funktion sendForm() einfach in den Skript Tag der MXML-Komponente, die eine Klasse darstellt, packst. Oder, Lösung 2, das du halt eine Referenz auf die Komponenten bei der Klasseninitialisierung von AddCustomersAS mitgibst. Ich glaube du verstehst wohl noch nicht das MXML - Komponenten ganz normale Klassen sind. |
| | |
| | #3 (permalink) |
| Nagelneuer User Registriert seit: Dec 2005
Beiträge: 924
|
Der Trick ist, ein Binding zu benutzen. Leg in der AS Klasse eine property textinput an, [Bindable] public var textinput : String; und verknüpfe sie in mxml per Binding <mx:TextInput text="{_AddCustomersAS.textinput}" ... /> _AddCustomersAS muss natürlich auch bindable sein. Auf die Art hast du Präsentation und Logik schön voneinander getrennt, denn durch das Binding muss die Logik gar nichts vom View wissen. Wenn du das konsequent durchziehst, kannst du die komplette Logik per FlexUnit testen, ohne auch nur eine einzige Ui Komponente erzeugen zu müssen. Code: public function testSendFormSetsTextToOK() : void
{
//setup fixture
var model : AddCustomersAS = new AddCustomersAS();
//execute test
model.sendForm();
//check results
assertEquals( "OK", model.textinput );
}
__________________ The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D Geändert von hazy fantazy (09-12-2007 um 18:42 Uhr) |
| | |
| | #4 (permalink) | |
| Neuer User Registriert seit: May 2003
Beiträge: 1.031
| Zitat:
hm verstehe, das macht Sinn. Allerdings sagt das MXML nun: PHP-Code: Danke Grüße Christian | |
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: May 2003
Beiträge: 1.031
|
Das funktioniert innerhalb der MXML Komponente: PHP-Code: In der AS Klasse habe ich dann eine public variable Namens "firstname": PHP-Code: Grüße Christian |
| | |
| | #6 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.142
| Das ist der richtige Weg. DataProvider feuern theoretisch auch unentwegt und wenn du dir mal ein paar Listenerausgaben von Trees oder anderen Komponenten ausgeben lässt, dann wirst du sehen das Events sehr effektiv sind. Die meisste Zeit für Rechenoperationen geht für das Rendering druff... |
| | |
| | #7 (permalink) | |
| Neuer User Registriert seit: May 2003
Beiträge: 1.031
| Zitat:
Trotzdem die Frage: "Bindable" oder "Listener"? Grüße Christian | |
| | |
| | #8 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.142
| Wenn du Bindable verwendest, erzeugst du implizit einen Listener. Als Beispiel könnte man wieder eine ArrayCollection oder XMLListCollection nehmen. Die informieren ihre Views auch automatisch, wenn die als DataProvider bei ihnen angemeldet sind. Die Collections feuern bei jeder Änderung ein CollectionEvent.COLLECTION_CHANGE. Durch die [Bindable] Deklaration werden im Framework die entsprechenden EventListener erzeugt. |
| | |
| | #9 (permalink) |
| Nagelneuer User Registriert seit: Dec 2005
Beiträge: 924
|
Es gibt hier zwei Richtungen. Von der AS Klasse (dem Model) in die MXML Klasse (den View) benutzt du Binding. Damit kannst du z.B. die Texteigenschaft eines Textfelds aus deinem Model heraus ändern, wie in meinem ersten Posting beschrieben. Umgekehrt, also vom View zum Model benutzt du Listener. Das wäre dann dein letztes Beispiel. Normalerweise würde ich allerdings eine Methode aufrufen, anstatt eine Eigenschaft des Models direkt zu verändern. Sowas in der Art: ... change="_AddCustomersAS.handleChangeFirstName( event.target.text )" ... Damit die Compilerwarnung verschwindet, musst du _AddCustomersAS auch Bindable machen,
__________________ The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D Geändert von hazy fantazy (10-12-2007 um 10:18 Uhr) |
| | |
| | #10 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.142
| Der Listener ist der Controller, um im MVC zu bleiben. Du brauchst den Controller um die Benachrichtigungen von der View zum Model zu schicken. Du könntest, um die View zu aktualisieren auch Events explizit feuern und entsprechende EventListener an Views/View-Komponenten registrieren. Die [Bindable] Deklaration nimmt dir diese Arbeit ab. [Bindable] setzt aber vorraus, dass die Klasse, deren Felder mit Views assoziiert sind als [Bindable] und public deklariert sind, oder das Felder direkt als [Bindable] und public deklariert sind oder implizite get und set Methoden verwendet werden. Diese müssen auch als [Bindable] und public deklariert sein. Ausserdem müssen die Instanzen/Referenzen auf die Instanzen in den jeweilige Scopes auch als [Bindable] deklariert sein. Ich benutze die version mit den impliziten get und set Methoden: ActionScript:
Geändert von Omega Psi (10-12-2007 um 08:49 Uhr) |
| | |
| | #11 (permalink) |
| Neuer User Registriert seit: May 2003
Beiträge: 1.031
|
Danke euch beiden! Das hat mir geholfen MVC besser zu verstehen. Ich wußte nicht das man ganze Klassen als Bindable definieren kann. Ich melde mich heute Abend sicherlich noch mal wenn ich alles Testen konnte was ihr mir hier angeboten habt. Besten Dank erst mal für eure Mühe! Grüße Christian |
| | |
| | #12 (permalink) |
| reXcel Registriert seit: Aug 2002 Ort: Herford
Beiträge: 4.774
|
Ich habe eine ähnliche Verständnisfrage - verstehe den richtigen Weg aber noch nicht. Beispiel: VideoDisplay Komponente Normal eingebunden und z.B. mit der ID 'video' versehen. Ich möchte nun von verschiedenen Komponenten/Klassen aus die sich im Projekt befinden auf die Variable 'source' des VideoDisplay zugreifen... also ein Video zuordnen. - Wie mache ich das dann am besten per AS? - Und wie am besten per MXML?
__________________ iPhone, iPad, Android und Flash Video Streamingserver Streaming & Live-Streaming für Flash, iPhone, iPad, iPod touch und Android. Inkl. Player, Videokonvertierung in optimierte Formate, Playercode, Flexplayer, etc... |
| | |
| | #13 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.142
|
Wenn du eine id in einem MXML Knoten vergeben hast, kannst du via Punkt-Notation drauf zugreifen (dich wie bei allen Pfaden durchpunkten). In ActionScript würde ich eine get-Funktion schreiben.
__________________ http://icodeapps.net | Meet me at the Flex user group Hamburg talking about CoffeeScript |
| | |
| | #14 (permalink) |
| reXcel Registriert seit: Aug 2002 Ort: Herford
Beiträge: 4.774
|
Hi Florian, das kommt mir aber so "quick&dirty" vor. Zudem ist es übelst unflexibel wenn das Projekt mal umgestrickt wird. Da gefällt mir das DataBinding schon besser. Doch hier habe ich den Dreh noch nicht verstanden. - Binding innerhalb einer Komponente ist kein Problem. - Auch kann ich auf die Eigenschaften von Instanzen zugreifen, die ich in der Komponente/Klasse gerade selber erzeugt habe. - Doch wenn ich z.B. in Main eine XX Klasse einbinde (bzw. Instanz erzeuge) und dann noch eine Klasse/Instananz ZZ. Und nun möchte ich von ZZ aus auf XX zugreifen... da erhalte ich Fehlermeldungen. Und da habe ich scheinbar ein Brett vor dem Kopf. Ich denke mal es ist nur eine Zeile Code die mir fehlt ..
__________________ iPhone, iPad, Android und Flash Video Streamingserver Streaming & Live-Streaming für Flash, iPhone, iPad, iPod touch und Android. Inkl. Player, Videokonvertierung in optimierte Formate, Playercode, Flexplayer, etc... Geändert von Sören (26-09-2008 um 09:36 Uhr) |
| | |
| | #15 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.142
|
Durchpunkten ist auch quick'n dirty... Um ein eigenes DataBinding zu ermöglichen: ActionScript:
Ich würde die Instanzen via get/set durch die Objekthierarchien durchreichen. Wenn die Hierachien zu tief sind, mag die Struktur für deine Belange nicht optimal sein und es bedarf etwas Nacharbeit... Du kannst auch über über einen get Accessor einer Klasse auf andere getter deligieren: ActionScript:
__________________ http://icodeapps.net | Meet me at the Flex user group Hamburg talking about CoffeeScript |
| | |
![]() |
| Lesezeichen |
| Stichworte |
| as3, komponente, mxml |
| Themen-Optionen | |
| Ansicht | |
| |