如何使用Cube框架将视图动态映射到Haxe中的mediator

时间:2012-03-11 20:54:28

标签: haxe robotlegs

我一直在使用并学习以下微框架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);
    }

}

现在主视图在主视图Mediator中加载后,我创建了“欢迎”视图,然后我想创建它的中介并像这样使用它。

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 个答案:

答案 0 :(得分:2)

我是haxe的新手,我正在尝试做某事Matt写的。这就是我到目前为止所做的:

在代理商的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 );

注意: 我发现你需要从Cube框架修改Agent.hx。滚动到此类的底部,并在最后一个方法中删除下划线。看起来应该是这样的:

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不能用于私有属性或某事;)

答案 1 :(得分:0)

我不知道框架,只能使用Robotlegs,但可能唯一的方法是通过在Command执行中映射View和Mediator。 您应该创建一个包含View和Mediator类的Event,为该事件注册Command,在需要时调度,并在执行时,Command应该使用mediatorMap。

希望它有所帮助。