как мне динамически отобразить вид на медиатора в Haxe с помощью фреймворка Cube - PullRequest
0 голосов
/ 12 марта 2012

Я работал и изучал следующую микросреду Cube https://github.com/xirsys/cube для использования в моих проектах Haxe.

Примеры, которые я нашел, были очень полезны, но одна вещь - примерыЯ столкнулся с тем, что не могу понять, как регистрировать и отображать представления для посредников во время выполнения.

Я думаю, что я близок, но, похоже, это не работает,Вот как выглядит мой AppContext.

class AppContext extends Agent<Dynamic, IEvent> 
{
    public function new(container: Dynamic, autoStart:Bool)
    {
        super(container, autoStart);
    }

    override public function initiate()
    {
        mediatorMap.mapView(Main, MainMediator);
        mediatorMap.mapView(Welcome, WelcomeMediator);

        injector.mapSingleton(AppModel, container);
        dispatch(AgentEvent.STARTUP_COMPLETE, null);
    }
}

Вот то, что происходит в моем моем Основном представлении

class Main extends Sprite
{
    public var agent: AppContext;

    @Inject
    public var dm:AppModel;

    public function new()
    {
        super();
        addEventListener(Event.ADDED_TO_STAGE, onAdded);
        haxe.Log.setColor(0xffffff);
        this.name = "main view";
    }

    public static function main(): Void
    {
        Lib.current.addChild(new Blastroidz());
    }

    private function onAdded(e:Event):Void
    {
        agent = new AppContext(this, false);
        agent.addEventHandler(AgentEvent.STARTUP_COMPLETE, onContextStart);
        agent.initiate();

    }

    private function onContextStart(evt:IEvent):Void
    {
        agent.mediatorMap.createMediator(this);
    }

}

Теперь, после того, как основное представление загружается в моем Основном представлении, Посредник, я создаю "Приветствие », а затем я хотел бы создать его посредник и использовать его следующим образом.

class MainMediator extends xirsys.cube.mvcs.Mediator
{
    @Inject
    public var view:Main;
    public var welcome:Welcome;
    private var viewManager:NMEViewManager;

    override public function onRegister()
    {
        super.onRegister();     
        eventDispatcher.addEventHandler(AppEvent.SET_NEW_VIEW, changeViewHandler);
        initView();
    }

    private function initView():Void
    {
        viewManager = new NMEViewManager(view);
        welcome = new Welcome();

        viewManager.setView(welcome, NMEViewManager.FADE);

            ///// this is the important line that doesn't seem to work \\\\\\
        mediatorMap.createMediator(welcome);
    }

    private function changeViewHandler(e:String):Void
    {
        trace("change view");
    }

Мой посредник приветствия выглядит так, и onRegister, похоже, не срабатывает, и я не получаю никаких ошибокна все .... обратите внимание, что viewManager обрабатывает addChild в главном представлении приветствия, и это, кажется, работает просто отлично.

class WelcomeMediator extends xirsys.cube.mvcs.Mediator 
{
    @Inject
    public var view:Welcome;

    override public function onRegister()
    {
        super.onRegister();
        view.addEventListener(Event.COMPLETE, onCompleteHandler);
        trace("welcome mediator registered");
    }

    private function onCompleteHandler(e:Event):Void
    {
        trace("logo complete");
        var event:AppEvent = new AppEvent(AppEvent.SET_NEW_VIEW);
        event.view_name = AppModel.MAIN;

        this.eventDispatcher.dispatch(AppEvent.SET_NEW_VIEW, event);
    }
}



}

Ответы [ 2 ]

2 голосов
/ 25 октября 2012

Я новичок в haxe и пытаюсь сделать то, о чем писал Мэтт.Так вот, что я до сих пор работал:

в методе initiate () вашего агента:

injector.mapInstance( Main, container ); // lets you inject the "container" into commands
mediatorMap.mapView( Welcome, WelcomeMediator );

, затем создайте выделенный класс команд (не делайте это в посреднике из-заархитектурные соображения) и введите «контейнер»:

@Inject
public var container : Main;

в метод execute ():

var welcomeView = new Welcome();
container.addChild( welcomeView );
mediatorMap.createMediator( welcomeView );

ВНИМАНИЕ: я обнаружил, что вам нужно изменить Agent.hx из среды Cube.Прокрутите до конца этого класса и избавьтесь от подчеркивания в последнем методе.Это должно выглядеть так:

private function bindMappings()
{
    injector.mapInstance( ICentralDispatcher, eventDispatcher );
    injector.mapSingleton( Injector );
    injector.mapInstance( ICommandMap, commandMap );
    injector.mapInstance( IMediatorMap, mediatorMap );
    injector.mapInstance( IViewMap, viewMap );
    injector.mapInstance( IProxy, proxy );
}

Кажется, что mapInstance не будет работать с частными свойствами или sth;)

0 голосов
/ 04 апреля 2012

Я не знаю фреймворк, работал только с Robotlegs, но, вероятно, единственный способ, которым вы могли бы это сделать, это сопоставить View и Mediator в Command, выполнить.Вы должны создать Событие, которое содержит классы View и Mediator, зарегистрировать Команду для этого события, посылать при необходимости и при выполнении Команда должна использовать mediatorMap.

Надеюсь, это поможет.

...