PDA

Volledige versie bekijken : [Uitleg] Hoe werkt MXML?


TheDutch
%Europe/Berlin %926 %2007, 22:13
Het valt me de laatste tijd op dat mensen die beginnen met Flex 2 niet echt weten hoe het in elkaar zit. Wat is MXML? Hoe werkt het? Hoe staat het in verhouding tot ActionScript 3?

Met dit onderwerp probeer ik op een hele simpele manier daar wat duidelijkheid over te creëren :).

MXML is werkelijk niets anders dan XML, zoals je XML kent voor het inladen van gegevens.

Dit stukje MXML:

<mx:Application>
<mx:DataGrid>
<mx:columns>
<mx:DataGridColumn />
</mx:columns>
</mx:DataGrid>
</mx:Application>


Zou net zo goed dit kunnen zijn:

<content>
<page>
<source>
<header />
</source>
</page>
</content>

XML - en dus ook MXML - doet zelf namelijk helemaal niets. Het is puur tekst en niets meer.

Adobe heeft echter een parser (http://en.wikipedia.org/wiki/Parsing) geschreven die MXML tags omzet naar ActionScript 3 code en dat vervolgens compiled (http://en.wikipedia.org/wiki/Compiler) naar een SWF bestand.

Dit stukje MXML:

<mx:DataGrid id="mijnDataGrid" width="200" height="300">
<mx:columns>
<mx:DataGridColumn headerText="Voornaam" dataField="voornaam" />
<mx:DataGridColumn headerText="Achternaam" dataField="achternaam" />
<mx:DataGridColumn headerText="Adres" dataField="adres" />
<mx:DataGridColumn headerText="Postcode" dataField="postcode" />
<mx:DataGridColumn headerText="Woonplaats" dataField="woonplaats" />
</mx:columns>
</mx:DataGrid>


Zou je zo in ActionScript 3 kunnen schrijven:

import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;

private function addDataGrid():void
{
var mijnDataGrid:DataGrid;
var mijnDataGridColumns:Array;
var mijnDataGridColumn1:DataGridColumn;
var mijnDataGridColumn2:DataGridColumn;
var mijnDataGridColumn3:DataGridColumn;
var mijnDataGridColumn4:DataGridColumn;
var mijnDataGridColumn5:DataGridColumn;

mijnDataGrid = new DataGrid();
mijnDataGrid.width = 200;
mijnDataGrid.height = 300;

mijnDataGridColumns = new Array();

mijnDataGridColumn1 = new DataGridColumn();
mijnDataGridColumn1.headerText = "Voornaam";
mijnDataGridColumn1.dataField = "voornaam";
mijnDataGridColumns.push(mijnDataGridColumn1);

mijnDataGridColumn2 = new DataGridColumn();
mijnDataGridColumn2.headerText = "Achternaam";
mijnDataGridColumn2.dataField = "achternaam";
mijnDataGridColumns.push(mijnDataGridColumn2);

mijnDataGridColumn3 = new DataGridColumn();
mijnDataGridColumn3.headerText = "Adres";
mijnDataGridColumn3.dataField = "adres";
mijnDataGridColumns.push(mijnDataGridColumn3);

mijnDataGridColumn4 = new DataGridColumn();
mijnDataGridColumn4.headerText = "Postcode";
mijnDataGridColumn4.dataField = "postcode";
mijnDataGridColumns.push(mijnDataGridColumn4);

mijnDataGridColumn5 = new DataGridColumn();
mijnDataGridColumn5.headerText = "Woonplaats";
mijnDataGridColumn5.dataField = "woonplaats";
mijnDataGridColumns.push(mijnDataGridColumn5);

mijnDataGrid.columns = mijnDataGridColumns;

this.addChild(mijnDataGrid);
}

Dit stukje MXML:

<mx:Button label="Klik mij!" click="this.clickHandler(event)" />

Zou je zo in ActionScript 3 kunnen schrijven:

import mx.controls.Button;
import flash.events.MouseEvent;

private function addButton():void
{
var mijnButton:Button;
mijnButton = new Button();

mijnButton.label = "Klik mij!";
mijnButton.addEventListener(MouseEvent.CLICK,this. clickHandler);

this.addChild(mijnButton);
}

Zoals je ziet is elk MXML component ook als ActionScript 3 neer te zetten omdat alle MXML code naar ActionScript 3 wordt omgezet wanneer je jouw project built.

Belangrijk om te weten!:
Wanneer een MXML tag begint met een hoofdletter betekent dit dat het een class is. Wanneer een MXML tag met een kleine letter begint betekent dit dat het een property is van de parent MXML tag.

Behandel MXML zoals je XML zou behandelen. Als iets in XML niet kan, dan kan dat ook niet in MXML. Houdt hier rekening mee wanneer je bijvoorbeeld line breaks in een TextArea wilt gebruiken.

Dit werkt bijvoorbeeld niet omdat line breaks standaard door XML geparsed worden:

<mx:TextArea>
<mx:text>
lijn 1
lijn 2

lijn 3
</mx:text>
</mx:TextArea>

Daarom moet je er <![CDATA[]]> omheen zetten zodat jij aangeeft dat alles wat daar tussenstaat niet geparsed mag worden:

<mx:TextArea>
<mx:text>
<![CDATA[
lijn 1
lijn 2

lijn 3
]]>
</mx:text>
</mx:TextArea>


Ik hoop dat deze korte uitleg meer duidelijkheid heeft gegeven over wat MXML is en hoe je het moet lezen om te begrijpen hoe het in verband staat met ActionScript 3 :).

Thomaz
%Europe/Berlin %485 %2007, 11:39
Misschien nog een handige aanvulling:

De tekst "mx:" in een tag zoals bijvoorbeeld "<mx:Application>" geeft de namespace aan.
Dat wil zeggen, je geeft er mee aan waar Flex de Class of een Attribuut kan vinden.
Deze namespace wordt aan het begin van elke component beschreven. Bijvoorbeeld:


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">


Hier staat eigenlijk zoiets als: de letters "mx" staan vanaf nu voor de namespace "http://www.adobe.com/2006/mxml". Dit is namelijk de standaard namespace voor Flex elementen.

Maar je kan zelf ook namespaces instellen voor objecten in je eigen structuur. Bijvoorbeeld:


<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:mijnSpace="applicatie.vensters.*">


Op de bovenstaande manier kan je de standaard Flex elementen gebruiken, maar ook Classes/Componenten die in de map "applicatie/vensters/" staan. Bijvoorbeeld:


<mijnSpace:MijnButtonComponent x="10" y="10" label="mijn knop" />

Waldo
%Europe/Berlin %542 %2007, 13:00
Hey, erg leuk zo'n uitleg posts! Wellicht goed om het eens allemaal in een wiki te zetten zodat het makkelijk door iedereen bij te werken is? Ik wil best wel iets opzetten.

TheDutch
%Europe/Berlin %861 %2007, 20:40
Is een idee al denk ik dat daar nu nog niet zo'n behoefte aan is. Pas wanneer er actiever over Flex wordt gepraat en er veel kennis wordt gedeelt op de huidige manier is het misschien een idee om er een Wiki voor op te zetten. Voor nu zou ik het persoonlijk lekker even zo laten.

Het kan natuurlijk zijn dat jij er andere ideeën over hebt en die hoor ik natuurlijk graag :).

Pointer
%Europe/Berlin %379 %2007, 09:07
Vindt het beide wel flex ;)

behived
%Europe/Berlin %413 %2007, 09:54
Ik denk dat TheDutch deze wiki bijna op zijn eentje zou moeten vullen voor het moment... Maar daar zal natuurlijk wel verandering in komen :)

TheDutch
%Europe/Berlin %427 %2007, 10:14
Dat was inderdaad ook mijn eerste idee Behived. Echter was ik zo snel even vergeten dat er ook Flex Developers zijn die helemaal niet op FlashFocus komen. Mijn gedachten is dus veranderd en ik ben al over een aantal dingen aan het nadenken.

De komende dagen heb ik denk ik wel ergens een uurtje om het wat beter uit te werken en hier te plaatsen. Laten we erover brainstormen! Ik ben ook erg benieuwd naar jouw ideeën Waldo :).

Waldo
%Europe/Berlin %690 %2007, 16:34
Precies zoals jij zegt; er zijn meer developers die hier niet zijn dan wel ;-) Ik kan zelf iets opzetten, maar ik laat het net zo lief (of liever?) over aan derden. Of dat nu FlashFocus, FlexFocus of iets anders is ;-)

ps: Meteen naamplaatje van Flex Usergroup (http://www.adobe.com/devnet/flex/?tab:community=1) aanhangen en extra support van Adobe lijkt verzekerd ;)

TheDutch
%Europe/Berlin %876 %2007, 21:02
Dank je! Ik zal er mijn hoofd eens in steken ;).

Neon
%Europe/Berlin %506 %2007, 12:09
*een lichte bump*
Grappig ik ben nu ook een beetje bezig met Flex te ontdekken. Ik vind het een super programma! Wat jij al zegt TheDutch is dat er nu nog niet veel over gesproken wordt. Wellicht dat dit in de toekomst veranderd. Want soms is het een behoorlijke tour als je naar een oplossing op het web zoekt (voor flex dan).

In de toekomst is het ook een idee om er een wiki, wat waldo dus al voorstelde, over op te zetten. Maar voor nu maak ik er een Sticky Topic van. ;)

Voor diegene die nog onbekend met Flex zijn is dit een ideale start. Helemaal omdat dit één van de weinige Nederlands geschreven uitleg is.

TheDutch
%Europe/Berlin %900 %2007, 21:36
Dank je Neon!

poindexter
%Europe/Berlin %108 %2007, 02:35
Wat kun je nou precies met flex betekenen voor een klant?

behived
%Europe/Berlin %419 %2007, 10:03
@poindexter
ik ben zelf nog niet op de hoogte van alle mogelijkheden, maar daar zal iemand anders nog wel wat uitleg over geven. Ik kan je wel een mooi voorbeeld laten zien:
https://www.polarpersonaltrainer.com/frontend/

poindexter
%Europe/Berlin %567 %2007, 13:37
Ik had het filmpje gezien op de adobe site en was nogal onder de indruk dat dit allemaal met flash kan. Ik vraag me af of www.beatport.com ook met flex is gemaakt. Verder zie ik het als een zeer maar dan ook zeer uitgebreide versie van een online Excel applicatie, maar dan mooier weergegeven.

ik ga er eens mee stoeien ben benieuwd wat de mogelijkheden zijn en of ik een goed concept kan ontwikkelen en dan kan verkopen aan mijn klanten.

Aros
%Europe/Berlin %784 %2007, 18:49
Eigenlijk is er dus een soort van template systeem bijgevoegd, met parsertags. Tenminste, wat ik zover heb gelezen :)

artie16
%Europe/Berlin %498 %2007, 11:57
miss voor de beginners om video cursussen van lynda.com te kopen?

iFlex
%Europe/Berlin %638 %2008, 16:18
Hier meld een nieuwe flex developer zich!