【问题标题】:Flex Hero: Loading XML data works, but List is not updatedFlex Hero:加载 XML 数据有效,但列表未更新
【发布时间】:2011-01-09 09:31:00
【问题描述】:

我有这个 Flex 4.5 (Burrito) 移动项目:

它包含 2 个文件 - TextXML.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:MobileApplication 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:components="spark.components.*" 
    firstView="views.Home">
</s:MobileApplication>

以及带有 1 个按钮、1 个列表和 1 个 HTTPService 的 Home.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:components="spark.components.*" 
    title="Home">

    <fx:Script>
        <![CDATA[
            import mx.collections.*;
            import mx.events.*;
            import mx.rpc.events.*;
            import mx.utils.*;
            import spark.events.*;

            [Bindable]
            public var myColl:XMLListCollection = new XMLListCollection();

            public function srvResult(event:ResultEvent):void {
                trace(ObjectUtil.toString(event.result));
                myColl.source = event.result.pref.user.money;
                myList.dataProvider = myColl;
            }
            public static function myLabelFunc(item:Object):String {
                return item.yw;             
            }
            public static function myMessageFunc(item:Object):String {
                return item.max;
            }
        ]]>
    </fx:Script>

    <fx:Declarations>
        <s:HTTPService 
            id="httpSrv" 
            url="http://preferans.de/user-xml.php?id=OK123195454365" 
            resultFormat="e4x" 
            result="srvResult(event)" 
            fault="trace(event.fault.message)" />
    </fx:Declarations>

    <s:navigationContent>
        <s:Button label="Load XML" click="httpSrv.send()"/>
    </s:navigationContent>

    <s:List id="myList" 
            top="0" bottom="0" left="0" right="0" 
            dataProvider="{myColl}">
        <s:itemRenderer>
            <fx:Component>
                <s:MobileIconItemRenderer 
                    labelFunction="Home.myLabelFunc"
                    messageFunction="Home.myMessageFunc" >
                </s:MobileIconItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
</s:View>

当我在调试器中运行我的应用程序(以便我可以在控制台中看到跟踪输出)并单击“加载 XML”按钮时,我看到 XML 数据从 my PHP script 加载正常:

<pref>
  <user id="OK123195454365" first_name="Dmitry"
   city="Moscow" money="8815" medals="1">
    <money yw="2011-01" max="8815" user="8815"/>
    <money yw="2010-52" max="6380" user="1545"/>
    <money yw="2010-51" max="8797" user="2094"/>
    <money yw="2010-50" max="8446" user="2080"/>
  </user>
</pref>

但不幸的是,列表仍然是空的。

我感觉这里少了一件小事,也许应该将一个事件发送到列表中?正如您在上面看到的,我已经尝试重新分配它的 dataProvider,但它对我没有帮助......

谢谢!亚历克斯

【问题讨论】:

    标签: xml apache-flex mobile dataprovider


    【解决方案1】:

    您的代码中有几个问题:

    1. event.result 已经指向 XML 的根节点,因此您无需调用 event.result.pref。
    2. 您应该使用 @ 语法来获取 XML 属性值。
    3. 如果要从内联 ItemRenderer 访问标签函数,则无需将它们设为静态。您应该使用 outerDocument 属性。最佳做法是创建一个新的 ItemRenderer mxml 并通过事件与其父级通信。

    以下代码应该可以工作:

    <?xml version="1.0" encoding="utf-8"?>
    

    <fx:Script>
        <![CDATA[
            import mx.collections.*;
            import mx.events.*;
            import mx.rpc.events.*;
            import mx.utils.*;
    
            import spark.events.*;
    
            [Bindable]
            public var myColl:XMLListCollection = new XMLListCollection();
    
            public function srvResult(event:ResultEvent):void {
                var xml:XML = event.result as XML; 
                myColl = new XMLListCollection(new XMLList(xml.user.money));
            }
            public function myLabelFunc(item:Object):String {
                return item.@yw;             
            }
            public function myMessageFunc(item:Object):String {
                return item.@max;
            }
        ]]>
    </fx:Script>
    
    <fx:Declarations>
        <s:HTTPService 
            id="httpSrv" 
            url="test.xml" 
            resultFormat="e4x" 
            result="srvResult(event)" 
            fault="trace(event.fault.message)" />
    </fx:Declarations>
    
    <s:navigationContent>
        <s:Button label="Load XML" click="httpSrv.send()"/>
    </s:navigationContent>
    
    <s:List id="myList" 
            top="0" bottom="0" left="0" right="0" 
            dataProvider="{myColl}">
        <s:itemRenderer>
            <fx:Component>
                <s:MobileIconItemRenderer 
                    labelFunction="{outerDocument.myLabelFunc}"
                    messageFunction="{outerDocument.myMessageFunc}" >
                </s:MobileIconItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    

    【讨论】:

    • 感谢您的精彩回答!我不明白一件事是如何工作的:myList 有 dataProvider="{myColl}" 并且同时为 myColl 分配了一个新的分配对象,每当从服务器加载 XML 时:myColl = new XMLListCollection(new XMLList(xml .user.money));它仍然有效吗?是正确的方法吗?
    • 据我记得,框架会自己处理这个问题。我不记得我在哪里读到的,但是如果您使用 keep-generated-actionscript 参数编译器,您将能够跟踪所有绑定发生的情况
    【解决方案2】:

    当只有1个子节点时,由于某种原因Flex不再把它当作一个数组,所以必须直接引用该节点。

    【讨论】:

      【解决方案3】:

      你试过了吗:

      public function srvResult(event:ResultEvent):void 
      {      myColl.source = event.result.pref.user.money as ArrayCollection;
             myList.dataProvider = myColl;
       }
      

      【讨论】:

      • 这给了我编译错误“1067:将 mx.collections:ArrayCollection 类型的值隐式强制转换为不相关的 XMLList 类型”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多