Использование составного компонента MXML из ActionScript - PullRequest
0 голосов
/ 01 сентября 2009

Я пытаюсь компонентизировать один из компонентов пользовательского интерфейса в приложении AIR, которое я разрабатываю во Flex. В этом примере я хочу отобразить информацию о файле в одной строке (которая имеет значок, текст / ссылку и размер).

Мой код выглядит следующим образом (компонент называется FileDisplay):

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            public function set iconType(source:String):void {
                this.ficon.source = source;
            }

            public function set fileName(name:String):void {
                this.fname.htmlText = name;
            }

            public function set fileSize(size:String):void {
                this.fsize.text = size; 
            }
        ]]>
    </mx:Script>
    <mx:Image id="ficon" />
    <mx:Label id="fname" left="20" right="30" text="Filename" />
    <mx:Label id="fsize" right="0" text="0 K" />
</mx:Canvas>

Когда я использую этот компонент в своем основном приложении, код действия выглядит следующим образом:

for each (var file:XML in result.files) {
    var fd:FileDisplay = new FileDisplay();
    fd.fileName = '<a href="blah">'+file.name+'</a>';
    fd.iconType = getFileTypeIcon(file.name);
    fd.fileSize = getFileSizeString(file.size);

    this.file_list.addChild(fd);
}

Однако, когда я делаю это, я получаю сообщение об ошибке: Ошибка # 1009: Не удается получить доступ к свойству или методу пустой ссылки на объект. Это связано с тем, что дочерние компоненты FileDisplay имеют нулевое значение (или, по крайней мере, они отображаются таким образом в отладчике).

Кто-нибудь знает, есть ли способ обойти это? Я должен ждать событий, указывающих, что дочерние компоненты были созданы? Есть ли более распространенный шаблон, который решает эту проблему?

На данный момент я могу вручную все делать в ActionScript в своем основном приложении (создать Canvas и добавить к нему дочерние элементы), но я был бы признателен за понимание того, как более четко разделить код.

Ответы [ 4 ]

3 голосов
/ 01 сентября 2009

Привязывается к спасению:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
                [Bindable]
                public var iconType:String;
                [Bindable]
                public var fileName:String = "Filename";
                [Bindable]
                public var fileSize:String = "0 K";
        ]]>
    </mx:Script>
    <mx:Image id="ficon" source="{iconType}"/>
    <mx:Label id="fname" left="20" right="30" text="{fileName}" />
    <mx:Label id="fsize" right="0" text="{fileSize}" />
</mx:Canvas>

значения будут автоматически обновляться при создании компонентов.

1 голос
/ 01 сентября 2009

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

= Ryan

1 голос
/ 01 сентября 2009

Субкомпоненты еще не загружены.

Читать это: http://livedocs.adobe.com/flex/3/html/help.html?content=ascomponents_advanced_2.html#203434.

Тогда, когда, как и я, вы не понимаете это (и это ненадежно), прослушайте FlexEvent.CREATION_COMPLETE в FileDisplay и примените там свойства дочернего компонента.

Или, что еще лучше, создайте троих детей программно в функции «createChildren» и примените настройки там.

Оба эти метода предполагают, что вы задаете имя файла, тип значка и размер файла как локальные члены, прежде чем применять их к дочерним компонентам, что вы должны делать независимо от этого.

0 голосов
/ 18 февраля 2010

В дополнение к установке CreationPolicy для всех, вам необходимо добавить DisplayObject на сцену с помощью addChild. Дочерние элементы FileDisplay не создаются, пока вы не добавите его на сцену. Так же:

for each (var file:XML in result.files) {
   var fd:FileDisplay = new FileDisplay();
   this.file_list.addChild(fd);

   fd.fileName = '<a href="blah">'+file.name+'</a>';
   fd.iconType = getFileTypeIcon(file.name);
   fd.fileSize = getFileSizeString(file.size);    
}
...