Flex Hero: загрузка данных XML работает, но список не обновляется - PullRequest
1 голос
/ 09 января 2011

У меня есть мобильный проект Flex 4.5 (Burrito):

alt text

Он состоит из 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>

и Home.mxml с 1 кнопкой, 1 списком и 1 HTTPService:

<?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 загружаются нормально из моего PHP-скрипта * * 1014

<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, как вы можете видеть выше, но это мне не помогает ...

Спасибо! Alex

Ответы [ 3 ]

2 голосов
/ 09 января 2011

В вашем коде есть несколько проблем:

  1. event.result уже указывает на корневой узел XML, поэтому вам не нужно вызывать event.result.pref.
  2. Вы должны использовать синтаксис @ для получения значений атрибутов XML.
  3. Вам не нужно делать ваши функции меток статичными, если вы хотите получить к ним доступ из встроенного ItemRenderer. Вы должны использовать свойство externalDocument. Лучше всего создать новый 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>

1 голос
/ 07 декабря 2011

Когда есть только 1 дочерний узел, по какой-то причине Flex больше не обрабатывает его как массив, поэтому вам нужно напрямую ссылаться на этот узел.

0 голосов
/ 09 января 2011

Вы пробовали:

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