Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Проблема использования s:Image внутри s:ItemRenderer (http://www.flasher.ru/forum/showthread.php?t=168445)

trng 20.09.2011 22:30

Проблема использования s:Image внутри s:ItemRenderer
 
Если реализовать стандартный пример “список изображений” типа http://blog.flexexamples.com/2008/03...elist-control/
но с использованием spark, то возникает проблема вывода картинок при таком синтаксисе:

Код AS3:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                                xmlns:s="library://ns.adobe.com/flex/spark"
                                width="165" height="200" opaqueBackground="0xEFEFEF">       
        <s:Label  text="{XML(data).@title}"/>
        <s:Image id="img" source="{XML(data).@thumb}" />
</s:ItemRenderer>

А именно:
  • {XML(data).@title} - отображается нормально (в компоненте s:Label)
  • {XML(data).@thumb} - вообще не отображается (в компоненте s:Image)


При этом без проблем работает две конструкции (при тех же самых параметрах для s:List, при том же самом dataProvider)

1. Оригинальная конструкция из примера (mx:Box вместо s:ItemRenderer и mx:Image вместо s:Image):

Код:

<mx:Box xmlns:fx="http://ns.adobe.com/mxml/2009"
                                xmlns:s="library://ns.adobe.com/flex/spark"
                                xmlns:mx="library://ns.adobe.com/flex/mx"
                                width="165" height="200" opaqueBackground="0xEFEFEF">
        <s:Label  text="{XML(data).@title}" />
        <mx:Image id="img" top="5" width="150" height="150" horizontalCenter="1"
                source="{XML(data).@thumb}" />
</mx:Box>


2. Использование функции в качестве значения img.source:

Код AS3:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                                xmlns:s="library://ns.adobe.com/flex/spark"
                                xmlns:mx="library://ns.adobe.com/flex/mx"
                                width="165" height="200" opaqueBackground="0xEFEFEF">
 
        <fx:Script>
                <![CDATA[
                        protected function dummyfunc(fn:String):String {
                                return fn;
                        }
                ]]>
        </fx:Script>
 
        <s:Label  text="{XML(data).@title}" />
        <s:Image id="img" source="{dummyfunc(XML(data).@thumb)}" />
</s:ItemRenderer>


Кстати, почему-то не работает такой вариант (http://www.flasher.ru/forum/showthread.php?t=164062):
Код AS3:

override public function set data(value:Object):void {
        img.source = XML(value).@thumb;
        trace(XML(value).@thumb);
        super.data = value;
}



Так или иначе тема поднимается регулярно (например здесь http://www.flasher.ru/forum/showthread.php?t=157149 и здесь http://www.flasher.ru/forum/showthread.php?t=164062).

Но "фундаментального" ответа на вопрос:
почему s:ItemRenderer + s:Image не может использовать xml-привязку в source, а mx:Box + mx:Image может?
я не нашел.

Может кто подскажет?

Dimitry_II 20.09.2011 23:36

А ты уверен, что проблема с s:Image?
XML(value).@attr возвращает не String, а XMLList. Поэтому думаю, что у s:Image просто другая трактовка приведения типа в отличие от SWFLoader (source у mx:Image наследовано у него). Кстати, твой второй работающий пример это подтверждает - когда значение текстовое и тип четко приведен, то срабатывает нормально.

Astraport 20.09.2011 23:42

Попробуйте задавать источник для Image в блоке
<fx:Script><![CDATA[
]]></fx:Script> ну и там протрейсить что он получает.

trng 21.09.2011 01:50

Цитата:

Сообщение от Dimitry_II (Сообщение 1033028)
А ты уверен, что проблема с s:Image?
XML(value).@attr возвращает не String, а XMLList. Поэтому думаю, что у s:Image просто другая трактовка приведения типа в отличие от SWFLoader (source у mx:Image наследовано у него). Кстати, твой второй работающий пример это подтверждает - когда значение текстовое и тип четко приведен, то срабатывает нормально.

Проблема таки с " другой трактовкой приведения типа в отличие от SWFLoader".
Вот так работает:

Код AS3:

...
<s:Image id="img" source="{String(XML(data).@thumb)}" />
...

А вот и объяснение. В SWFLoader.loadContent есть такой код:
Код AS3:

 ...
else
        {
            // We have something that is not a class or string (XMLNode, for
            // example). Call toString() and try to load it.
            url = classOrString.toString();
...

Ни в s:Image, ни в его родителях ничего такого я не нашел.

Добавлено через 3 минуты
Аналогичным образом заработал и вариант с set data:

Код AS3:

override public function set data(value:Object):void {
        img.source = String(XML(value).@thumb);
        trace(XML(value).@thumb);
        super.data = value;
}



Часовой пояс GMT +4, время: 07:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.