Event.Complete не срабатывает при загрузке URL - PullRequest
0 голосов
/ 11 августа 2010

Я опытный разработчик AS, но это что-то очень основное в flex, что я не могу понять. В приведенном ниже классе я не уверен, почему функция imageLoaded не будет выполняться, когда изображение загружает URL-адрес. Есть ли здесь условия гонки? Приложение полностью загружается к моменту создания этого объекта и вызывается setPicture . Как я могу заставить событие Event.COMPLETE правильно запускаться в этом случае?

Функции line и Log.info для меня удобны, и они определенно работают.

Вот мое определение MXML:

<?xml version="1.0" encoding="utf-8"?>
<photo:PhotoClass xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:photo="com.xxx.widgets.photo.*">
    <mx:Image id="image"/>
</photo:PhotoClass>

Вот мой сценарий действий:

public class PhotoClass extends Box {

    public var image : Image;

    public function PhotoClass() {
        image = new Image();
        image.addEventListener(Event.COMPLETE, imageLoaded);
    }

    private function line(txt : *) : void {
        Log.info(txt, "PhotoClass");
    }

    public function setPicture(url : String) : void {
        line("setPicture: " + url);         
        image.source = url;         
    } 

    public function imageLoaded(event : Event) : void {
        line("image loaded");
    }
}

Ответы [ 2 ]

3 голосов
/ 12 августа 2010

eventListeners не будет регистрироваться, если спрайт не прикреплен к приложению.

Можете ли вы дать ссылку? Потому что я считаю, что проблема в другом.

Когда вы объявляете файл mxml с PhotoClass в качестве корневого тега, вы расширяете PhotoClass. <mx:Image> tag в mxml определяет открытую переменную типа Image в классе mxml; и у вас уже есть public var image:Image; в суперклассе. Это создаст конфликт - я ожидаю ошибку времени компиляции.

Я предполагаю, что поскольку конструктор вызывается первым, он присваивает объект Image общедоступной переменной image. Когда выполняется mxml и создаются дочерние элементы, он назначает новый объект Image для публичной переменной image (вместо правильной выдачи ошибки). Теперь прослушиватель событий был добавлен к экземпляру Image, созданному в конструкторе, но к тому времени, когда вы установите image.source в setProperty, это будет совершенно другой объект. Вот почему это работает, когда вы перемещаете прослушиватель событий на setPicture - там вы назначаете его новому объекту.

Измените id тега mxml Image на что-то другое, и оно будет работать, даже если прослушиватель событий был добавлен из конструктора. Измените имя public var image на другое, и вы получите ошибку времени компиляции в PhotoClass.

Кстати, что делает тег Image в mxml - это для показа другого изображения? В этом случае вы должны изменить его id.

<!-- MyCanvas.mxml -->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Label id="lbl"/>
</mx:Canvas>

<!-- the main application class -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" 
   creationComplete="onCreate()" layout="vertical">
  <local:MyCanvas id="canvas1"/>
  <mx:Script>
    <![CDATA[
      public var canvas2:MyCanvas;
      public function onCreate():void
      {
        this.canvas1.lbl.text = "MyCanvas_1";
        canvas2 = new MyCanvas();
        this.addChild(canvas2);
        canvas2.addEventListener(FlexEvent.CREATION_COMPLETE, onCanvas2Created);
      }
      public function onCanvas2Created(e:FlexEvent):void
      {
        this.canvas2.lbl.text = "MyCanvas_2";
      }
    ]]>
  </mx:Script>
</mx:Application>
2 голосов
/ 11 августа 2010

Я понял это ...

EventListeners не будет регистрироваться, если спрайт не прикреплен к приложению .EventListener в этом случае добавлялся в конструктор до того, как спрайт был добавлен в его родительский класс.Я переместил image.addEventListener в setPicture , и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...