2009-11-08 9 views
0

J'ai un httpservice qui renvoie des données XML. J'ai aussi une grille de données en utilisant les données retournées et en les transmettant aussi au moteur de rendu qui fonctionne parfaitement.Flex Configuration dataProvider pour un itemRenderer

<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> 

Pour chaque résultat dans les données xml J'ai un code qui crée une nouvelle panel() et 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); 
     } 

Cependant, je ne suis pas en mesure d'utiliser le même {data.name} dans ce que je fais renderer dans le moteur de rendu DataGrid. Au lieu de cela, je suis "indéfini" pour chaque champ ... Comment vais-je passer le {httpService.lastResult.item} au rendu de page aussi?

EDIT: Les modifications apportées ..

C'est le gestionnaire de résultats 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); 
        } 
      } 
     } 

J'ai aussi essayé ..

 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); 
        } 
      } 
     } 

J'ai aussi changé la pR.data = data dans la fonction viewstack_addChild. Je reçois encore les informations dans le DataGrid, et je reçois les données sur chaque page rendue mais chaque page a la même information (le premier résultat) au lieu de chaque résultat pour chaque page ...

Répondre

0

Je recommande de ne pas faire du dataProvider les données renvoyées par le service http plutôt que de lier une variable à utiliser pour stocker ces données. Ensuite, toute composante météo de l'interface utilisateur initialisée ou non peut l'utiliser.

[Bindable] 
var httpDataService:Object; 

function getData():void 
{ 
    hpptDataService = httpService.lastResult.item; 

. }

DataGrid ...

dataprovider = "{httpDataService}" 

autres composants de l'interface utilisateur

dataProvider = httpDataService

ou dans votre cas

data = httpDataService 

Flex a se rappeler les cotrols que l'initialisation paresseuse donc si votre autre contrôle n'est pas initialisé au moment où vous faites votre demande http, il n'y a pas de chance. Ce qui suit provient de la référence de pile de vues, mais s'applique à tout contrôle qui n'est pas visible par l'utilisateur jusqu'à ce qu'il soit sélectionné ...

Remarque: La stratégie de création par défaut pour tous les conteneurs, à l'exception du conteneur Application, est la suivante: politique du conteneur parent. La stratégie par défaut du conteneur Application est auto. Dans la plupart des cas, par conséquent, les enfants du contrôle View Stack ne sont pas créés tant qu'ils ne sont pas sélectionnés. Vous ne pouvez pas définir la propriété selectedChild sur un enfant qui n'est pas encore créé.

+0

Merci AndrewB! – medoix

0

Je pense que le Le problème est que vous définissez des données comme PageListRenderer, qui ressemblent étrangement à une classe au lieu des données que vous voulez.

+0

PageListRenderer est la page de rendu mxml. Le code actuel affiche le moteur de rendu dans le panneau(); et fonctionne si je pointe les fournisseurs de données à {Application.application.HomePage.myDG.seletecteditme.name} cependant cela ne fonctionne que lorsque vous cliquez et item dans la grille de données et crache des erreurs lors du chargement et essayer d'ajouter ces éléments lorsque rien dans le DataGrid est sélectionné. D'où la raison pour laquelle j'essaye de mettre les données de httpservice dedans ... ou ai-je manqué quelque chose tous ensemble lol, merci pour la réponse rapide. – medoix

+0

J'ai ajouté quelque chose que j'ai essayé ci-dessus ... ne fonctionne toujours pas .. – medoix

Questions connexes