Ich habe Probleme mit einer Flex-App, die ich erstelle. Ich glaube, das Problem liegt in meinem schlechten Verständnis des Komponentenlebenszyklus und ich würde einige Hinweise sehr schätzen!Problem mit der Komponentenerstellung
Meine App läuft in der Luft. Die Anwendung erstellt ein Array von DashItems. Ein DashItem ist eine ActionScript-Klasse, die Canvas erweitert. Basierend auf Daten, die beim Erstellen des DashItem übergeben wurden, werden verschiedene Komponenten zu diesem Canvas hinzugefügt. Wenn z. B. das Kürzel "grid" ist, wird ein EvGrid erstellt. EvGrid ist eine auf DataGrid basierende mxml-Komponente. Das DashItem legt die URL fest und ruft eine öffentliche Funktion in EvGrid auf, die den HTTPService send() initiiert. Daten werden abgerufen und im Raster angezeigt. Dies funktioniert wie erwartet.
Hier ist der knifflige Teil. Ich möchte diese DashItems scrollen (denke Snackr). Also habe ich in der Hauptanwendung einen Eventlistener für Event.ENTER_FRAME eingerichtet. Die Funktion, die aufgerufen wird, scrollt die Elemente auf dem Bildschirm und recycelt sie, wenn sie von oben nach unten scrollen. Wenn ich diesen EventListener direkt nach dem Erstellen meines Arrays von DashItems erstelle, wird nichts angezeigt. Debuggen Ich sehe die Komponenten in den DashItems, die ihre Daten vom HTTPService erhalten, und ich sehe, wie mein Scroll-Code die Y-Einstellungen anpasst, aber im Anwendungsfenster ist nichts zu sehen.
Wenn ich das Hinzufügen des eventListener für ENTER_FRAME verzögert, indem Sie einen weiteren Zeitgeber festlegen, der nach Abschluss den Ereignishandler ENTER_FRAME aktiviert, werden die Elemente angezeigt. Wenn der dataService langsam zurückkehrt, erhalte ich manchmal ein leeres Raster. Der Grid-Datenprovider ist bindbar.
Dies führt zu der Annahme, dass ich einen Teil des Lebenszyklus der Komponenten trample. Ich werde unten einige Code-Snippets einfügen. Danke für jegliche Hilfe oder Ratschläge für diesen Anfänger.
Scroller.mxml in mx: Script Abschnitt
public function handleApplicationComplete(event:Event):void {
dataService.send();
}
public function faultHandler(event:FaultEvent): void {
trace(event.toString());
}
public function resultHandler(event:ResultEvent): void {
trace("returned XML: " + event.result.toString());
for each (var i:XML in event.result.item) {
var dx:DashItem = new DashItem({
type: i.type,
url: i.url.toString(),
index: i.index,
title: i.title,
description: i.description,
height: this.height/(DISPLAY_LIST_SIZE -1),
width: this.width * 0.9
});
trace("created " + dx.toString());
DashList.unshift(dx);
}
buildDisplayList();
var timer:Timer = new Timer(1000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, startAnimation);
timer.start();
}
private function startAnimation(event:TimerEvent):void {
trace("starting animation");
addEventListener(Event.ENTER_FRAME, animate);
}
private function buildDisplayList():void {
var starty:Number = this.height;
var listSize:Number = DISPLAY_LIST_SIZE;
if (DashList.length < DISPLAY_LIST_SIZE) {
listSize = DashList.length;
}
for (var i:Number = 0; i < listSize; i++) {
var di:DashItem = DashList.pop();
displayList.unshift(di);
di.y = starty;
scroller.addChild(di);
starty += di.height + PADDING;
}
trace("DisplayList is: ");
traceList(displayList);
}
Auswahlrad der Http:
<mx:HTTPService
id="dataService"
url="{DS_URL}"
resultFormat="e4x"
fault="faultHandler(event);"
result="resultHandler(event);" />
DashItem.as Snippet
public function build():void {
if (type == "grid") {
trace("Building EventList...");
var ev:EvGrid = new EvGrid();
ev.evtitle = this.title;
this.addChild(ev);
ev.fetchData();
} else if (type == "StatChart") {
EvGrid Schnipsel:
<mx:HTTPService
id="dataService"
url="{ws}"
resultFormat="e4x"
result="resultsHandler(event);"
fault="faultHandler(event);"
/>
<mx:XMLListCollection id="eventListXml" source="{xmlData.events.event}"/>
<mx:Panel id="evwrapper" title="{evtitle}" width="100%" height="100%">
<components:RowColorDataGrid id="EventListGrid"
dataProvider="{eventListXml}"
width="100%"
height="100%"
rowCount="{eventListXml.length+1}"
rowColorFunction="calcRowColor">
<components:columns>
<mx:DataGridColumn
id="Serial"
dataField="serial"
headerText="Serial"
width="70"
/>
<mx:DataGridColumn
id="Severity"
dataField="severity"
headerText="Severity"
width="60"
/>
<mx:DataGridColumn
id="snlStatus"
dataField="snlstatus"
headerText="snlStatus"
width="100"
/>
<mx:DataGridColumn
id="Owneruid"
dataField="owneruid"
headerText="Owner"
width="70"
/>
<mx:DataGridColumn
id="Node"
dataField="node"
headerText="Node"
width="120"
/>
<mx:DataGridColumn
id="Summary"
dataField="summary"
headerText="Summary"
labelFunction="getCdata"
/>
</components:columns>
</components:RowColorDataGrid>
</mx:Panel
>
Danke für den Link! – Todd