我有一个Flex3应用程序,HTTPService返回Atom提要。我从中捕获结果并将其存储在arrayCollection中,然后是我的Datagrid的提供者。 我从我的数组的“第一级”访问数据没有问题,但不能在它下面。 不太清楚,所以这里有一些代码:
我的XML [部分内容]:
<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>
我的数据网格代码:
<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>
“标题”列正确显示数据,但状态列为空!当我在调试模式下启动我的应用程序时,我可以看到我的notesArray具有正确的格式,我可以访问todo - &gt;状态值为...
我已经坚持了几天,我很感激任何帮助! 谢谢和最好的问候!!
答案 0 :(得分:0)
这可能与“status”节点使用与标题不同的名称空间“clb”这一事实有关。您可能需要指定命名空间才能访问它的数据。
从.NET WebService检索XML数据时,我必须做类似的事情。我花了几天时间搞清楚。
如果你的XML看起来像这样:
<?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>
将此添加到处理HTTPService结果的ActionScript中:
private namespace clbNS = "CLB.data";
use namespace clbNS;
例如:
包 { 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
}
}
}
给它射击,它可能会起作用!!!
答案 1 :(得分:0)
我非常确定DataGridColumn / AdvancedDataGridColumn的dataField属性不会自动解析嵌套属性,即“todo.status”;您可能想尝试编写一个labelFunction,它将为您访问嵌套的XML元素。
答案 2 :(得分:0)
当涉及到这类问题时,我遵循的一般规则就是做这样的事情(只是为了确保你得到你正在寻找的一切):
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 ) );
}
在那之后,我的第一次尝试将取代它:
<mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/>
用这个:
<mx:AdvancedDataGridColumn headerText="STATUT" dataField="{ todo.status }"/>
很多时候,Flex根本不能很好地使用嵌套属性,但是当你使用括号时,它会将在该位置找到的值作为更直接的引用。
我认为你最好在ArrayCollection上使用XMLListCollection。这样,您可以按名称调用子项,而不是依赖于IList中的正常索引。