0

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



}
4

2 回答 2

2

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

在您的代理的initial() 方法中:

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 不适用于私有财产或某事;)

于 2012-10-25T11:52:40.730 回答
0

我不知道框架,只与 Robotlegs 一起使用,但可能唯一的方法是在命令执行中映射视图和调解器。您应该创建一个包含 View 和 Mediator 类的事件,为该事件注册命令,在需要时调度,并且在执行时,命令应该使用 mediatorMap。

希望能帮助到你。

于 2012-04-04T18:22:59.837 回答