2013-05-31 72 views
0

我正在使用Flex/ActionScript读取一些XML。当我加载XML时,Flash Builder给了我一个错误,说Error: Unknown Property: 'EventTitle'. at mx.collections::ListCollectionView/http://www.adobe.com/2006/actionscript/flash/proxy::getProperty()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:870].我引用'EventTitle'的唯一地方是我将它加载到列表中的地方。Flex/ActionScript,PHP和XML错误

当我从XML中删除<Invite>部分时,它加载正常。但是,一旦我再次添加它,它会给我错误。下面是XML的结构:

<Invites> 
     <Invite> 
     <EventTitle>HelloWorld</EventTitle> 
     </Invite> 
     <Invite> 
     <EventTitle>HelloWorld2</EventTitle> 
     </Invite> 
    </Invites> 

我使用PHP创建XML:

if ($_POST['method'] == "GET_INVITES") { 
    $sql = mysql_connect("localhost:8889", "---------------", "--------------"); 
    if(!$sql) { 
     die('Could not connect:' . mysql_error()); 
    } 

    mysql_select_db("Calendar", $sql); 
    $getInvitesQuery = mysql_query("SELECT * FROM `Invites` WHERE `To`='" . $_POST['userID'] . "'"); 

    $result = "<Invites>"; 
    $result .= "<Result>SUCCESS</Result>"; 
    while($row = mysql_fetch_array($getInvitesQuery)){ 
     $result .= "<Invite>"; 
     $result .= "<FromID>" . $row['From'] . "</FromID>"; 
     $result .= "<EventTitle>" . $row['Title'] . "</EventTitle>"; 
     $result .= "<EventDay>" . $row['Day'] . "</EventDay>"; 
     $result .= "<EventHour>" . $row['Hour'] . "</EventHour>"; 
     $result .= "<EventMinute>" . $row['Minute'] . "</EventMinute>"; 
     $result .= "</Invite>"; 
    } 
    $result .= "</Invites>";  
    print($result); 
} 

我在的Flex/ActionScript中使用的HTTPService从PHP文件中的XML加载到一个列表。这里是代码:

<s:HTTPService id="getInvites" result="getInvitesResult(event)" method="POST" url="http://localhost/invite.php" useProxy="false"> 
      <s:request xmlns=""> 
       <method>GET_INVITES</method> 
       <userID>{my_id.text}</userID> 
      </s:request> 
     </s:HTTPService> 

<s:List id="invites" x="5" y="295" width="310" change="rowSelected(event)"> 
     <s:dataProvider> 
      <s:ArrayCollection source="{getInvites.lastResult.Invites.Invite.EventTitle}"/> 
     </s:dataProvider> 
    </s:List> 

我一直在努力找出2-3小时的解决方案。任何帮助深表感谢。

感谢, 雅各

+0

你共享你的错误,这是很好的。你已经分享了很多很好的代码。但是,您可能会考虑尝试告诉我们哪些代码正在抛出错误。它什么时候抛出错误? – JeffryHouser

回答

0

我觉得这里有几个问题:

不要在你的E4X XML对象的根标签表达式

当使用E4X表达式,你不应该包含XML的根标签。因此,尝试改变这一行:

<s:ArrayCollection source="{getInvites.lastResult.Invites.Invite.EventTitle}"/> 

要:

<s:ArrayCollection source="{getInvites.lastResult.Invite.EventTitle}"/> 

正如您能再根标签添加到XML的替代,使您的原始表达式是有效的:

<root> 
    <Invites> 
     ... 
    </Inivtes> 
</root> 

向列表提供适当的数据提供者

e4x表达式“Invite.EventTitle”(在您的XML上使用时)将返回一个XMLList对象。这不适合作为dataProvider用于列表。列表的dataProvider属性需要实现接口的东西。幸运的是,您只需创建一个XMLListCollection对象。你将需要重构你的代码,以便你可以创建这个XMLListCollection

一种方法是将resultfault处理程序添加到您的HTTPService。这实际上比使用lastResult属性更好。原因是,当您的应用程序多次调用服务时,使用lastResult可能不是指正确的结果。

里面的result事件处理程序,您可以创建新的XMLListCollection并设置就行了:在上述

<s:HTTPService id="getInvites" result="handleResult(event)" fault="handleFault(event)" resultFormat="e4x" ... /> 

private function handleResult(event:ResultEvent):void 
{ 
    var xml:XML = event.result as XML; 
    var xmlList:XMLList = xml.Invite.EventTitle; // an XML "array" of event titles 
    var xmlCollection:XMLListCollection = new XMLListCollection(xmlList); 
    // now set xmlCollection as the dataProvider for the list 
    invites.dataProvider = xmlCollection; 
} 

注意,我还指定了resultFormatHTTPService为“E4X”。

以上是从记忆编码,所以有可能是在这里或那里错误;)