PDA

Volledige versie bekijken : Best Practice Databinding


Thomaz
%Europe/Berlin %483 %2007, 11:36
In het project waar ik aan werk kom ik steeds hetzelfde probleem tegen: Databinding.
Waarschijnlijk pak ik het steeds verkeerd aan en krijg ik daardoor meldingen als "unable to detect changes".
Vandaar mijn vraag: wat is hiervoor "best practice"?

Een voorbeeld van wat ik nu doe:
Vanuit PHP krijg ik met AMFPHP dit binnen in Flex:

class -> array -> class -> values

Oftewel een classe met daarin een array waarin weer classes staan.
(Bijvoorbeeld een classe "producten" met daarin een array vol "product"-en)

In Flex krijg ik deze netjes binnen als Object. En dit Object stop ik in een Cairngorm ModelLocator.

Werkt verder prima en met "getItemAt(index)" kan ik alles prima tevoorschijn toveren.
Toch zijn er situaties waarin het niet erg fijn werkt. Vandaar mijn vraag.

Zijn ArrayCollections beter dan Object? Is het beter om mijn PHP structuur anders aan te pakken?

Alvast bedankt.

TheDutch
%Europe/Berlin %836 %2007, 20:04
Laat eens zien wat je met PHP precies doet zodat ik het hele plaatje heb en je beter advies kan geven ;).

Arrays en Objecten zijn niet bindable. Alleen collections, (as) classes, en variables zijn bindable binnen het Flex Framework. Dus het is sowieso goed om met ArrayCollections te werken. Het beste is dus om PHP een array te laten retourneren met waarden i.p.v. een object en die in Flex om te zetten naar een ArrayCollection. Voorbeeld: new ArrayCollection(jouwArray);. Echter wanneer het geen recordset is maar een simpel object met losse waarden dan moet je die losse waarden alsnog in aparte variables stoppen binnen een class (ModelLocator) of een Model om ze bindable te maken.

Ik denk dat het duidelijker wordt waneer ik zie wat je probeert te bereiken en hoe dat momenteel gebeurd :).

Thomaz
%Europe/Berlin %407 %2007, 09:47
Is het dan beter om geen key's te gebruiken in je array, maar indexes?
Dus: mijnArray[0] ipv mijnArray["naam"]

Zelf vind ik het makkelijk om key's te gebruiken zodat je snel data kunt achterhalen.
Maarwanneer je bijvoorbeeld dit doet:
<mx:Button name="{mijnArray['naam']}" ...
..komen er natuurlijk een flink aantal warnings voorbij.
Je zou dan moeten werken met getChildAt ed. Maar dan hebben de key's weer geen zin.

Ik heb er nog het een en ander over gelezen en ga nu zelf met Value Objects (as classes) aan de slag. Dat lijkt me een behoorlijk mooie oplossing, omdat Flex dan 'weet' wat voor data er verwacht kan worden.
Het nadeel is misschien dat je bij het inladen van 'PHP-data' je misschien een vertaalslag moet maken, omdat je die gegevens niet direct in een VO kan zetten.
Maar hopelijk kan je vanuit PHP precies dezelfde class sturen, zodat je deze 1 op 1 in een ModelLocator kan zetten.

Maar misschien kan je me alsnog overtuigen van ArrayCollections ;)

Waldo
%Europe/Berlin %413 %2007, 09:55
Kijk ook eens naar de metadata tag [Bindable] (http://livedocs.macromedia.com/flex/2/docs/00001042.html), niet altijd de oplossing maar wel handig om te weten van het bestaan hiervan

Thomaz
%Europe/Berlin %423 %2007, 10:10
Kijk ook eens naar de metadata tag [Bindable] (http://livedocs.macromedia.com/flex/2/docs/00001042.html), niet altijd de oplossing maar wel handig om te weten van het bestaan hiervan

Zeker handig. Ik wist er van en gebruik ze om mijn ValueObjectClasses bindable te maken:

package
{
[Bindable] public class Product
{
public var productID: Number;
}
}

Thomaz
%Europe/Berlin %646 %2007, 15:31
In het kort doe ik nu dit:

[Bindable] public class Klas1
{
public var klasses: ArrayCollection;

public function Klas1()
{
this.klasses = new ArrayCollection();
}
}

[Bindable] public class Klas2
{
public var naam: String;
}

[Bindable] public var mijnKlasses: Klas1;
mijnKlasses = new Klas1;
var tmp_klas: Klas2 = new Klas2;
tmp_klas.naam = "naam";
mijnKlasses.klasses.addItem(tmp_klas);

De var mijnKlasses staat in een ModelLocator. Dit werkt nu perfect, maar is het ook de beste manier?

TheDutch
%Europe/Berlin %868 %2007, 20:50
Waarom heb ik nog geen antwoord op mijn vragen? :).

Vertel eens precies wat je wilt bereiken en laat eens precies zien hoe je PHP er nu uitziet en gelieve ook je AS. Ik heb op dit moment niets aan pseudocode. Er is niet altijd één oplossing voor alles dus is het nodig om dingen wat duidelijker te hebben zodat ik je goed kan helpen.

Voor mij komt het op dit moment erg onduidelijk over en zeer omslachtig...

Thomaz
%Europe/Berlin %404 %2007, 09:41
Ok, ik zal wat duidelijker proberen te zijn.

Ik ben op zoek naar een goede betrouwbare manier om data die vanuit PHP komt in mijn ModelLocator te zetten, zodat componenten hier hun data kunnen vinden.
Het maakt mij niet zoveel uit wat er vanuit PHP naar Flex wordt gestuurd en andersom, want dat is altijd wel aan te passen.

Alleen collections, (as) classes, en variables zijn bindable binnen het Flex Framework.Dit was erg handige informatie. En ik heb nu besloten om Classes te gebruiken.
In het project heb ik namelijk product-groepen en producten. Daarom leek het me handig om bijvoorbeeld een productgroepen-class te maken met daarin een ArrayCollection vol productgroep-classes (zoals in m'n voorbeeld).

Wat ik nu in iedergeval erg handig vind, is dat ik het volgende kan doen om bijvoorbeeld een productnaam te pakken te krijgen:
name="{model.products.productList.getItemAt(2).name}"

Maar Flex blijft voor me behoorlijk nieuw en daarom vraag ik me af of er geen betere methodes voor zijn.

TheDutch
%Europe/Berlin %434 %2007, 10:25
Nogmaals er is niet één methode voor alle toepassingen. Elke methode heeft zijn voor- en nadelen in bijvoorbeeld performance (overhead). Daarom wil ik van jou graag weten wat je precies wilt bereiken, hoe je PHP er precies uit ziet, en hoe je de data wilt gaan gebruiken in Flex 2. Dat zijn drie hele belangrijke punten om over na te denken voor je methodes kiest waarmee je het gaat realiseren.

Ik heb deze vraag nu al drie keer aan je gesteld maar ik krijg geen antwoord op mijn vragen. Het is voor mij erg lastig om je op die manier te helpen. Geef nu eens antwoord op mijn vragen ;).

Thomaz
%Europe/Berlin %619 %2007, 14:52
Ok, ik denk dat ik je verkeerd begrepen heb. En misschien was ik erg onduidelijk... :S

Ik werkt met Cairngorm. Daarmee werkt je volgens een bepaalde methode die behoorlijk vast staat. Alleen het opslaan van Data in de ModelLocator kan op nogal wat verschillende manieren. Vandaar dat ik me afvroeg hoe dat het best zou kunnen.

Inmiddels heb ik gevonden waar ik naar zocht. Alex Uhlmann (http://weblogs.macromedia.com/auhlmann/) heeft er een aantal goede artikelen over geschregen: How Business Logic Can Manage Views.

In iedergeval bedankt voor je reacties.

TheDutch
%Europe/Berlin %628 %2007, 15:05
Je snapt me nog steeds totaal niet en ik heb het idee dat ik niet duidelijker kan zijn. Ik werk continue met Cairngorm dat heeft ook verder niets te maken met dit geheel. Het opslaan van data in de ModelLocator kan inderdaad op velen manieren, echter is er geen "beste" manier. Het hangt helemaal van de situatie af welke methode je gaat toepassen zoals ik reeds verschillende malen heb proberen aan te geven.

Ik ben bang dat dit bericht je ook niet duidelijk zal zijn en ik je dus niet verder kan helpen. Succes met je project! :).

Thomaz
%Europe/Berlin %652 %2007, 15:39
Hehe, we hebben duidelijk een spraakverwarring. Nu ik het zo teruglees geef je in je eerste antwoord al de oplossing:
Arrays en Objecten zijn niet bindable. Alleen collections, (as) classes, en variables zijn bindable binnen het Flex Framework.
Best Practice is dan, denk ik, het gebruik van Arrays en Objecten vermijden. En verder voor elke situatie bekijken wat het handigst is ;)