2009-05-22 6 views
0

J'ai une application Flex 3 avec un service HTTPS retournant un flux Atom. J'en attrape le résultat et le stocke dans un arrayCollection qui est alors le fournisseur de mon Datagrid. Je n'ai aucun problème pour accéder aux données du «premier niveau» de mon tableau, mais je ne peux pas y accéder. pas très clair, voici donc un code:Impossible d'accéder aux enfants de arrayCollection dans datagrid

Mon XML [partie]:

<entry> 
<title>Test 2</title> 
<id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id> 
<link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/> 
<published>2009-05-14T16:17:37+02:00</published> 
<updated>2009-05-14T16:17:56+02:00</updated> 
<clb:todo> 
<clb:uid>7D66***3ED3C12575B6004E8479</clb:uid> 
<clb:due>2009-05-31T12:01:00+02:00</clb:due> 
<clb:status>Not Started</clb:status> 
</clb:todo> 
</entry> 

Mon code Datagrid:

 <mx:AdvancedDataGrid y="10" id="notesGrid" width="90%" height="243" designViewDataType="flat" x="10" selectionMode="multipleRows" dataProvider="{notesArray}" > 
      <mx:columns> 
       <mx:AdvancedDataGridColumn 
        headerText="TITRE" 
        dataField="title" 
        fontWeight="bold" 
       /> 
       <mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/> 
      </mx:columns> 
     </mx:AdvancedDataGrid> 

La colonne "titre" montre les données correctement , mais la colonne d'état est vide! Quand je lance mon application en mode débogage, je peux voir que mon notesArray a le bon format et que je peux accéder à todo -> status avec la valeur ...

Je suis coincé là-dessus depuis quelques jours, je J'apprécierais toute aide! Merci et meilleures salutations !!

Répondre

0

Une règle générale je suis en ce qui concerne les problèmes de ce genre est de faire quelque chose comme ça (juste pour vous assurer que vous obtenez tout ce que vous cherchez):

import flash.utils.getQualifiedClassName; 

// As a general rule, I don't find it the best idea to access an object in 
// an IList (ArrayCollection, XMLListCollection, et al) by a dynamic property. 
// Especially when they are coming from XML, the best way to access everything 
// is through getItemAt. 
var len:int = todo.length; 
for(var i:int = 0; i < len; i++) 
{ 
    var item:* = todo.getItemAt(i); 
    trace(item, getQualifiedClassName(item)); 
} 

Après cela, mon premier essai serait remplacer ceci:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/> 

avec ceci:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="{ todo.status }"/> 

Très o ften Flex ne fonctionne pas du tout avec les propriétés imbriquées, mais lorsque vous utilisez les parenthèses, la valeur trouvée à cet emplacement est plus directe.

Je pense que vous devriez aussi utiliser un XMLListCollection sur un ArrayCollection. De cette façon, vous pouvez appeler les enfants par leur nom au lieu de s'appuyer sur leur index normal dans IList.

0

Cela peut avoir quelque chose à voir avec le fait que le noeud "status" utilise un espace de nommage différent de "clb" que votre titre. Vous devrez peut-être spécifier l'espace de noms afin d'accéder à ses données.

Je devais faire quelque chose de similaire lors de la récupération de données XML à partir d'un WebService .NET. Il m'a fallu quelques jours pour le comprendre.

Si votre XML ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<atomFeed xmlns:clb="CLB.data"> 
    <entry> 
    <title>Test 2</title> 
    <id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id> 
    <link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/> 
    <published>2009-05-14T16:17:37+02:00</published> 
    <updated>2009-05-14T16:17:56+02:00</updated> 
    <clb:todo> 
    <clb:uid>7D66***3ED3C12575B6004E8479</clb:uid> 
    <clb:due>2009-05-31T12:01:00+02:00</clb:due> 
    <clb:status>Not Started</clb:status> 
    </clb:todo> 
    </entry> 
</atomFeed> 

Ajouter ceci au code ActionScript où vous gérez le résultat HTTPService:

private namespace clbNS = "CLB.data"; 

use namespace clbNS; 

Par exemple:

package { import mx .rpc.events.ResultEvent;

public class handleAtomFeed 
{ 
    private namespace clbNS = "CLB.data"; 

    use namespace clbNS; 

    private function resultHandler(event:ResultEvent):void 
    { 
     // pares the XML and build your ArrayCollection 
    } 
} 

}

Donnez-lui a tiré, ça pourrait fonctionner !!!

+0

Bonjour Ben, Merci pour le conseil. Malheureusement, j'ai déjà essayé d'utiliser l'espace de noms dans l'application, mais cela n'a toujours pas fonctionné. Et l'espace de noms est maintenant effacé automatiquement quand je l'ai mis dans mon ArrayCollection ... Le problème est seulement dans le datagrid ... Quand je fais un Alert.show (notesArray [1] .todo.status) dans mon AS, Je reçois une alerte avec la valeur correcte! Ainsi câblé: S – Florian

0

Je suis à peu près certain que la propriété dataField de DataGridColumn/AdvancedDataGridColumn ne résout pas automatiquement les propriétés imbriquées, c'est-à-dire "todo.status"; vous pouvez essayer d'écrire un labelFunction qui accèdera à l'élément XML imbriqué pour vous.

Questions connexes