2012-03-11 17 views
0

我一直在研究和學習以下微框架Cube https://github.com/xirsys/cube以用於我的Haxe項目。如何使用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); 
    } 
} 



} 

回答

0

我不知道的框架,只有Robotlegs的工作,但也許你可以做到這一點的唯一方法是通過映射視圖和命令執行調解。 您應該創建一個包含View和Mediator類的Event,爲該事件註冊Command,在需要時進行調度以及執行時,Command應使用mediatorMap。

希望它有幫助。

2

我是haxe的新手,我正在努力去做一些Matt寫的東西。所以,這就是我到目前爲止已經摸索出:

開始()你代理的方法:

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

然後創建一個專用的命令類(不這樣做的調停由於架構的原因)和注入 「容器」:

@Inject 
public var container : Main; 
在執行

()方法:

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不會對私人財產或某事工作;)