1

我尝试编写基于框架pureMVC的小型as3程序。我了解它的基本原理,但我不明白,我必须在哪里放置自定义逻辑。例如,我必须加载 10 张图像。我创建了命令,即 init Proxy。

package app.controller 
{
    import app.model.GalleryProxy;
    import dicts.Constants;
    import org.puremvc.interfaces.INotification;

    public class LoadFilesCommand extends BaseCommand
    {
        public function LoadFilesCommand() { }

        override public function execute(note:INotification):void
        {
            facade.registerProxy(new GalleryProxy(Constants.FILES_LIST));
        }
    }
}

代理是:

package app.model 
{
    import dicts.Constants;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.events.ErrorEvent;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.net.URLRequest;
    import org.puremvc.interfaces.IProxy;
    import org.puremvc.patterns.proxy.Proxy;

    public class GalleryProxy extends Proxy implements IProxy
    {
        public function GalleryProxy(list:Vector.<String>)
        {
            super(Constants.PROXY_GALLERY);
            _fileList = list;
            _total = _fileList.length;
            load();
        }

        public function get currentImage():Bitmap
        {
            return _images[_index];
        }

        //--------------------------------------------------------------------------
        // PRIVATE SECTION 
        //--------------------------------------------------------------------------
        private var _fileList:Vector.<String>;
        private var _total:uint;
        private var _loaded:uint = 0;
        private var _images:Array = [];
        private var _index:int;

        private function load():void
        {
            var loader:Loader;
            for (var i:int = 0; i < _total; i++)
            {
                loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadHandler);
                loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
                loader.load(new URLRequest(_fileList[i]));
            }
        }

        private function imageLoadHandler(event:Event):void
        {
            var info:LoaderInfo = LoaderInfo(event.currentTarget);
            _images[Constants.FILES_LIST.indexOf(info.url)] = info.content;
            info.removeEventListener(Event.COMPLETE, imageLoadHandler);
            info.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            _loaded++;
            if (_loaded >= _total)
                sendNotification(Constants.COMMAND_SHOW_MAIN);
        }

        private function errorHandler(event:ErrorEvent):void
        {
            throw new Error("bad link or internet disconnect");
        }
    }
}

现在我的代理正在独立加载图像(函数 load() 和 imageLoadHandler)是否正确?或者我必须将此逻辑移至 Command 类?或者我必须创建一些包含此逻辑的 LoadService.as?pureMVC 的正确变体是什么?

4

1 回答 1

1

你想在应用程序启动时加载你的 10 个图像吗?如果没有,load()请公开并从 Mediator 调用它,响应 UI 事件。

如果是这样,您所拥有的将正常工作。一种替代方法是编写 GalleryProxy,这样它就不会load()在构造函数中调用 - 相反,您可以让 Command 注册代理,加载图像列表,然后proxy.load(images[i])循环调用。

于 2015-01-14T18:34:09.480 回答