Прикрепление свойства к событию во Flex / AS3 - PullRequest
1 голос
/ 13 ноября 2009

У меня есть параметр, который необходимо передать вместе с событием. После неудачных попыток поместить его в тип путем расширения класса, мне посоветовали в другом вопросе SO написать пользовательское событие.

Я пробовал это раньше, но я не мог понять, как отправить его, потому что я просто хочу отправить другой параметр с обычным событием Event.COMPLETE в FileReference. Я не могу запустить Event.COMPLETE и затем отправить свое событие, потому что тогда я буду в той же лодке ... необходимый параметр не будет в исходном объекте Event.COMPLETE, поэтому я не смогу отправить новое событие, передающее этот параметр в код, который фактически выполняет работу.

Вся помощь в этом очень ценится, она очень нужна. Спасибо.

По сути, мне нужно заменить функциональность Event.COMPLETE такой, какая она есть, мне просто нужно событие, которое будет содержать мое дополнительное свойство. Пожалуйста, скажите мне, что есть способ сделать это.

Ответы [ 6 ]

9 голосов
/ 13 ноября 2009

сначала вам нужно добавить прослушиватель событий в Event.COMPLETE как обычно, так как он будет отправлен автоматически, и с этим ничего не поделаешь. Внутри этого обработчика событий вы можете отправлять свои собственные пользовательские настройки, даже если остальная часть приложения ожидает их, с вашим пользовательским свойством, прикрепленным к нему. Вот быстрый пример:

ваш код обработки событий будет выглядеть так:

yourObject.addEventListener(Event.COMPLETE, function(event:Event):void{

  var myEvt:MyEvent = new MyEvent(MyEvent.COMPLETE, myCustomProperty);
  dispatchEvent( myEvt );

})

и класс MyEvent выглядит следующим образом:

package
{

  import flash.events.Event;

  public class MyEvent extends Event
  {

    public static const COMPLETE:String = "MyEventComplete";

    var myCustomProperty:*;

    public function MyCustomEvent(type:String, prop:*) :void
    {

      myCustomProperty = prop;

      super(type);
      // if you want your event to bubble 
      // be sure to specify : super(type, true)
    }

   //override clone() so your event bubbles correctly
   public override function clone() :MyEvent {

     return new MyEvent(this.type, this.myCustomProperty)

   }
  }
}

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

addEventListener(MyCustomEvent.COMPLETE, someFunction);
2 голосов
/ 13 ноября 2009
  1. Создать пользовательское событие с параметром данных
  2. Ваш класс ((например, MyObject) должен перехватить Event.COMPLETE с помощью addEventListener и отправить ваше пользовательское событие MyCustomEvent с вашими данными в нем
  3. Поймайте ваше MyCustomEvent где-нибудь еще (например, в MyAnotherObject)

MyCustomEvent.as

package
{
 import flash.events.Event;

 public class MyCustomEvent extends Event
 {
  public static const MY_CUSTOM_EVENT_COMPLETE:String = "myCustomEventComplete";

  public var data:Object;

  // Constructor
  public function CaretEvent(type:String, data:Object, bubbles:Boolean=false, cancelable:Boolean=false)
  {
   super(type, true, cancelable);

   this.data = data;
  }

  // Public Methods
  public override function clone():MyCustomEvent
  {
   return new MyCustomEvent(type, data, bubbles, cancelable);
  }
 }
}

MyObject.as

package
{
 import flash.events.EventDispatcher;
 import flash.events.Event;

 public class MyObject extends EventDispatcher
 {
  // Contructor
  public function MyObject()
  {
   addEventListener(Event.COMPLETE, onComplete)
  }

  // Private Methods
  private function onComplete(event:Event):void
  {
   dispatchEvent(new MyCustomEvent(MyCustomEvent.MY_CUSTOM_EVENT_COMPLETE, "This is my custom data"));
  }
 }
}

MyAnotherObject.as

package
{
 import flash.events.Event;
 import flash.events.EventDispatcher;

 public class MyAnotherObject extends EventDispatcher
 {
  // Constructor
  public function MyAnotherObject()
  {
   addEventListener(MyCustomEvent.MY_CUSTOM_EVENT_COMPLETE, onMyCustomEventComplete)
  }

  // Private Methods
  private function onMyCustomEventComplete(event:MyCustomEvent):void
  {
   trace(event.data);
  }
 }
}
2 голосов
/ 13 ноября 2009

Я не эксперт, но у меня работает следующее. (Имена изменены, чтобы защитить невинных).

Вот одно из моих пользовательских событий:

import flash.events.Event;
public class SomethingHappenedEvent extends Event {
    public static const SOMETHING_COMPLETE:String = "PictureTakenComplete";
    public var passedValue:int;

    public function SomethingHappenedEvent(i:int) {
        passedValue = i;
        super(SOMETHING_COMPLETE);      
    }
}

У меня есть слушатель, настроенный для прослушивания моего пользовательского события. Когда пользовательское событие срабатывает, моя функция doSomething() выполняется. Вот как я это настроил:

mySecret.addEventListener(SomethingHappenedEvent.SOMETHING_COMPLETE,doSomething);

Внутри функции doSomething() у меня есть доступ к параметру passedValue события:

private function doSomething(e:SomethingHappenedEvent):void {
    trace("did something: " + e.passedValue);
}

Наконец, вот как я отправляю пользовательское событие в другом месте кода, передавая параметр:

this.dispatchEvent(new SomethingHappenedEvent(myCounter));
0 голосов
/ 14 ноября 2009

Судя по всему, вам может не потребоваться расширение FileReference, Event.COMPLETE и т. Д., Если все, что вам нужно, это другое свойство ... подойдет ли следующее для ваших целей? Если нет, покажите мне код, чтобы мы могли быть на одной странице.

public function go():void {
    var downloadURL:URLRequest = new URLRequest("http://example.com/big.jpg");
    var otherParam:String = "another param";
    var fileRef:FileReference = new FileReference();
    fileRef.addEventListener(Event.COMPLETE, function(e:Event):void {
                                                handleLoad(e,otherParam); });
    fileRef.download(downloadURL);
}

public function handleLoad(e:Event,whatelse:String):void {
    Alert.show("we just loaded " + e.target + " with param " + whatelse);
}

Это даст дополнительный параметр (whatelse) в функцию handleLoad(), которая выполняет эту работу. Или вы говорите, что во время загрузки у вас нет дополнительного параметра?

0 голосов
/ 13 ноября 2009

Я обычно делаю что-то подобное, может быть, не самый лучший подход, но вы должны знать, что этот способ доступен ...

myObj.addEventListener("creationComplete", function(e:Event):void{otherFunction(e, "another Arg")});
0 голосов
/ 13 ноября 2009

Не могли бы вы опубликовать некоторый код, чтобы мы могли видеть, как вы подходите к этому?

Однако я настоятельно рекомендую прочитать flex live docs при создании и использовании пользовательских событий.

Здесь - это простое пользовательское приложение, основанное на событиях. Посмотрите на источник, это может быть то, что вы ищете.

...