2011-01-09 2 views
1

У меня есть этот Flex 4.5 (Burrito) Мобильный проект:Flex Hero: Загрузка данных XML работает, но список не обновляется

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> 

Когда я бегу мое приложение в отладчик (так что я могу видеть вывод трассировки в консоли) и нажмите на кнопку «Load 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, как вы можете видеть выше, но это мне не помогает ...

Спасибо! Alex

ответ

2

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

  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 [email protected];    
     } 
     public function myMessageFunc(item:Object):String { 
      return [email protected]; 
     } 
    ]]> 
</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> 

+0

Спасибо за отличный ответ! Я не понимаю, как работает 1 вещь: myList имеет dataProvider = «{myColl}», и в то же время myColl получает новый выделенный объект, всякий раз, когда XML загружается с сервера: myColl = new XMLListCollection (новый XMLList (xml) .user.money)); Он все еще работает, и это правильный путь? –

+0

Из того, что я помню, каркас обрабатывает это для вас. Я не могу вспомнить, где я это читал, но если вы используете компилятор аргументов keep-generated-actionscript, вы сможете отслеживать, что происходит со всеми связями –

0

Вы попробуйте:

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

Это дает мне ошибку компиляции «1067: Неявное принуждение значения типа mx.collections: ArrayCollection для XMLList несвязанного типа». –

1

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