2009-04-17 3 views
3

Это вопрос конкретно о создании пользовательского класса Loader в качестве продолжения до How do I modify existing AS3 events so that I can pass data?. Если бы это было неправильным способом, расскажите мне об этом.Пользовательский класс AS3 Loader, который использует собственный класс LoaderInfo?

У меня есть пользовательский класс Loader и собственный класс LoaderInfo. Я не могу понять, как использовать класс Loader для пользовательского класса LoaderInfo, поскольку это свойство contentLoaderInfo.

package com.display { 
    import flash.display.Loader; 

    import com.display.CustomLoaderInfo; 

    public class CustomLoader extends Loader { 
     public var customData:*; 

     public function CustomLoader(passedData: *= null) { 
      customData = passedData; 
     } 
    } 
} 

^должны сделать что-то там, чтобы сделать его иметь новый CustomLoaderInfo

package com.display { 
    import flash.display.LoaderInfo;  
    import flash.events.Event; 

    import com.events.CustomEvent; 

    public class CustomLoaderInfo extends LoaderInfo { 
     public var customData:*; 

     public function CustomLoaderInfo(passedData: *= null) { 
      customData = passedData; 
     }  

     override public function dispatchEvent(event:Event):Boolean { 
      var customEvent:CustomEvent = new CustomEvent(event.type, customData, event.bubbles, event.cancelable); 
      return super.dispatchEvent(customEvent); 
     } 
    } 
} 

^Это может работать, но так как я не могу получить CustomLoader, чтобы использовать его, я не знаю, все же.

+0

10 Это не сработает, потому что вы не можете подклассифицировать LoaderInfo, это вызовет ошибку «Ошибка # 2012: класс CustomLoaderInfo не может быть создан». – Wernight

ответ

4

Я не знаю, как это вписывается в то, что вы делаете, но вы не могли бы вообще заниматься расширением LoaderInfo. Loader.contentLoaderInfo имеет свойство loader, которое будет возвращать загрузчик (или в этом случае CustomLoader), который использовался. В теории вы можете просто сделать это с классом CustomLoader, что у вас есть:


var loader: CustomLoader = new CustomLoader("Extra Data"); 
loader.load(new URLRequest("file.swf")); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete); 

function loaderComplete(event: Event) : void 
{ 
    var customData:* = (event.target.loader as CustomLoader).customData; 
    trace(customData); // Extra Data 
} 
0

Вам нужно будет переопределить функцию, в которой создается экземпляр loaderinfo, и это может быть в частной функции. В новой функции вы могли бы затем инициировать свой собственный класс loaderInfo, но вам также нужно было бы сделать что-нибудь еще, что сделал перезаписанный метод. Вы можете столкнуться с некоторыми проблемами безопасности с помощью loadinfo. Перезапись такой функции обычно возможна только тогда, когда функция, написанная с учетом этого.

В качестве альтернативы вы можете использовать цепочку прототипов (read here), чтобы изменить класс loaderInfo во время выполнения. Но я бы не рекомендовал его. На мой взгляд, это не очень хорошая практика.

Если у вас все получилось, у вас все еще есть проблема, связанная с тем, что ваше пользовательское событие не будет работать ни с одним событием, у которого есть свойства, которые не наследуются от класса Event (например, ProgressEvent со свойствами, связанными с прогрессом).

Я бы сказал, что вы должным образом должны искать другое решение. В вопросе, на который вы ссылаетесь, вы говорите о передаче мувиклипа с вашим событием. Вы думали о том, чтобы достичь другого? Когда вы получаете событие, вы получаете ссылку на объект, который отправил его (Event.target). Не можете ли вы использовать эту ссылку для получения мувиклипа?

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

0

мне нужно было что-то вроде этого, потому что я хотел бы носить индекс с информацией ... то есть - что-то вроде event.target.index доступны после события запускается .. в любом случае я разработал класс, содержащий загрузчик и информацию загрузчика ... Heres класс

общественного класса LoaderBox расширяет Sprite {

public static var PROGRESS:String = "progress" 
    public static var COMPLETE:String = "complete" 

    public var id:int 
    public var index:int 
    public var loader:Loader 
    public var info:LoaderInfo 
    public var isOpen:Boolean 
    // 
    public var percent:Number = -1 

    public function load(path:String,idx:int=-1,nm:String=null){ 
     loader = new Loader() 
     if (nm != null){ 
      name = nm 
     } 
     index = idx 
     var req:URLRequest = new URLRequest(path) 
     info = loader.contentLoaderInfo 
     info.addEventListener(Event.COMPLETE,complete) 
     info.addEventListener(ProgressEvent.PROGRESS,progress) 
     isOpen = true 
     loader.load(req) 
    } 
    private function complete(e:Event):void{ 
     isOpen = false 
     dispatchEvent(new Event(LoaderBox.COMPLETE)) 
    } 
    private function progress(e:ProgressEvent):void{ 
     if (e.target.bytesTotal>0){ 
      percent = Math.floor(e.target.bytesLoaded/e.target.bytesTotal * 100) 
     } 
     dispatchEvent(new Event(LoaderBox.PROGRESS)) 
    } 

}

0

Потенциальная проблема с помеченным ответом: если ContentLoaderInfo выплевывает IOError, вы не можете получить доступ к свойству .loader, чтобы получить доступ к вашему пользовательскому классу загрузчика.

То, что я сделал следующий: * в моем пользовательском классе загрузчика, создайте следующий метод:

public function requestError(event:Event):void { 
     dispatchEvent(event);   
    } 

при добавлении слушателя contentLoaderInfo для IOERROR, точка методы пользовательского погрузчика класса:

_loaderCls.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _loaderCls.requestError); 

Затем добавьте тот же самый слушатель к вашему классу загрузчика и попросите его вызвать любой метод, в котором вы нуждаетесь. В этот момент event.target будет то, что пользовательский класс загрузчика, и вы можете добавить любую дополнительную информацию, необходимую для этого класса:

_loaderCls.addEventListener(IOErrorEvent.IO_ERROR, requestError); 
0

или вы можете сделать лучше вещь, чтобы передать данные в класс Loader :


package com.display 
{ 
    import flash.display.Loader; 

    public class Loader extends flash.display.Loader 
    { 
     private var _obj:Object; 

     public function Loader():void 
     { 
      super(); 
     } 

     public function get obj():Object 
     { 
      return _obj; 
     } 

     public function set obj(o:Object):void 
     { 
      _obj = o; 
     } 
    } 

}