Flex Impostazione dataProvider per un itemRenderer
-
18-09-2019 - |
Domanda
Ho un HTTPService che restituisce i dati XML.
<mx:HTTPService id="httpService" url="data/Software.xml" resultFormat="e4x" result="httpResult_handler(event)" fault="Alert.show('XML Data Error')" />
Inoltre ho un datagrid utilizzando i dati restituiti e anche di passarlo al renderer che funziona perfettamente.
<mx:DataGrid id="myDG"
dataProvider="{httpService.lastResult.item}"
headerHeight="0"
editable="false"
width="100%" height="100%"
rowHeight="50"
itemClick="switchView(myDG.selectedItem.name);">
<mx:columns>
<mx:DataGridColumn itemRenderer="com.xd.components.renderers.SoftwareListRenderer" />
</mx:columns>
</mx:DataGrid>
Per ogni risultato nei dati XML ho qualche codice che crea una nuova panel()
e renderer.
private function viewstack_addChild(name:String):void {
var p:Panel = new Panel();
p.id = name;
p.name = name;
p.title = name;
p.percentWidth = 100;
p.percentHeight = 100;
var randColor:uint = Math.random() * 0xFFFFFF;
p.setStyle("backgroundColor", randColor);
var pR:PageListRenderer = new PageListRenderer();
var data:Object;
//Do something to get the data to be displayed;
pR.data = PageListRenderer;
p.addChild(pR);
myViewStack.addChild(p);
}
Comunque io non sono in grado di utilizzare lo stesso {data.name}
in questo renderer come faccio in renderer DataGrid. Invece ottengo "non definito" per ogni campo ... Come potrei fare per passare il {httpService.lastResult.item}
alla pagina renderer anche?
EDIT: Le modifiche apportate ..
Questo è il gestore di risultati HTTPService.
private function httpResult_handler(evt:ResultEvent):void {
if (evt.result.software.item) {
data = XML(evt.result).descendants("item");
var item:Object = data;
for each(item in data) {
viewstack_addChild(item.name);
}
}
}
Inoltre ho provato ..
private function httpResult_handler(evt:ResultEvent):void {
if (evt.result.software.item) {
data = httpService.lastResult.item;
var item:Object = data;
for each(item in data) {
viewstack_addChild(item.name);
}
}
}
Ho cambiato anche il pR.data = data
nella funzione viewstack_addChild
.
Io sono sempre le informazioni nel datagrid ancora, e sto ottenendo i dati su ogni pagina visualizzata tuttavia ogni pagina ha le stesse informazioni (il primo risultato), invece di ogni risultato per ogni pagina ...
Soluzione
Raccomando di non rendere il dataProvider essendo i dati restituiti dal servizio http piuttosto legano una variabile da utilizzare per memorizzare questi dati. Poi ogni tempo componente di interfaccia utente inizializzato o non è possibile utilizzarlo.
[Bindable]
var httpDataService:Object;
function getData():void
{
hpptDataService = httpService.lastResult.item;
. }
datagrid ...
dataprovider = "{httpDataService}"
altri componenti dell'interfaccia utente
dataProvider = httpDataService
o nel tuo caso
data = httpDataService
ricordare Flex ha le cotrols come l'inizializzazione pigra quindi se il vostro altro controllo non è inizializzato nel punto in cui si effettua la richiesta HTTP è fuori di fortuna. Quanto segue è dal riferimento guarda la pila ma praticamente si applica a qualsiasi controllo che non è visibile all'utente fino selezionata ...
Nota: La politica di creazione di default per tutti i contenitori, ad eccezione del contenitore di applicazioni, è la politica del contenitore principale. Il criterio predefinito per il contenitore Application è auto. Nella maggior parte dei casi, quindi, i bambini del controllo View Stack non vengono creati fino a quando non sono stati selezionati. Non è possibile impostare la proprietà selectedChild ad un bambino che non è ancora creata.
Altri suggerimenti
Credo che il problema è che si imposta i dati di essere PageListRenderer, che sembrano sospettosamente come una classe, invece di dati che si desidera.