2013-06-12 93 views
4

我在與在我marionette.js應用循環引用一個問題..循環引用marionette.js

的問題是:

App.js創建了一個具有控制器的路由器,並且控制器需要再次app.js所以它可以將視圖添加到區域..正如你可以看到下面(控制器)當我打印Application它返回undefined,因爲circulare參考..

controller.js:

define(
['app', 'views/ProjectItemView'], 
function (Application, ProjectItemView) 
{ 
    'use strict'; 
      console.log(Application); // undefined 

    return Marionette.Controller.extend({ 
     showProjects : function() 
     { 
      Application.main.show(new ProjectItemView()); 
      console.log('project'); 
     } 
    }); 
} 
); 

router.js:

define 
    (
     ['marionette'], 
     function(Marionette) 
     { 
      'use strict'; 

      return Marionette.AppRouter.extend 
      (
       { 
        appRoutes: 
        { 
         'dashboard/projects' : 'showProjects' 
        } 
       } 
      ); 
     } 
    ); 

app.js

define 
(
    [ 
     'backbone', 'marionette', 'jquery', 'routers/DashboardRouter', 'controllers/DashboardController', 
     'views/dashboard/Header' 
    ], 
    function(Backbone, Marionette, $, DashboardRouter, DashboardController, Header) 
    { 
     'use strict'; 

     var app = new Marionette.Application(); 

     app.addRegions({ 
      header: '#header', 
      main: '#main', 
     }); 

     app.header.show(new Header()); 

     app.on('initialize:after', function() { 
      Backbone.history.start({pushState: true}); 
      app.router = new DashboardRouter({ 
       controller : DashboardController 
      }); 
     }); 

     $(document).on("click", "a[href^='/']", function(event) 
     { 
      var href = $(event.currentTarget).attr('href'); 
      console.log(href); 

      event.preventDefault(); 
      app.router.navigate(href, {trigger: true}); 
      return false; 
     }); 

     return app; 
    } 
); 

現在什麼是解決這個問題的最好方法是什麼?我是全新的,所以我不知道最佳做法是什麼..

也是正確的,我添加在我的控制器的意見?或者我應該在其他地方做那個?

在此先感謝

+0

你可以請把你的應用程序文件? –

+0

是的,我已經添加了它,請看看:) –

回答

4

,我認爲你應該以實例化它的時候通過一個區域控制器,你definitly需要移動你的代碼。我有一個示例應用程序可以工作,但不需要,但是在控制器中創建區域並從主應用程序向其傳遞區域的概念可以在此處進行簡化。

App.addInitializer(function() { 
    var controller = new BookStoreController({region: App.mainRegion}); 
    layout = new CatalogLayout(); 
    controller.region.show(layout); 
    var router = new Router({controller:controller}); 
}); 

http://jsfiddle.net/rayweb_on/hsrv7/11/

希望有所幫助。

+0

所以基本上只是通過該地區作爲控制器的參數?我會嘗試 –

+0

這工作正常,但我等待接受這個答案,直到我有關於模塊的其他答案一些更多的信息。 –

1

如果我正確理解你,本質上,你有路由器取決於應用程序和控制器取決於應用程序。

如果是這樣的話,你可以將它們分成三個模塊,App,Router和Controller。 然後在路由器和控制器模塊中定義['app',...]。 Here是我用於JMQ的一些其他基本代碼結構。

更新時間: 從Using-marionette-with-requirejs,還討論了有關「避免循環依賴」

+0

你的意思是https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.application.module.md?我什麼時候需要調用這些模塊,可以添加更多的信息,因爲我不明白。謝謝! –

+0

我提到了requirejs模塊,你可以在這裏閱讀它如何使用requirejs和木偶。 https://github.com/marionettejs/backbone.marionette/wiki/Using-marionette-with-requirejs在這個wiki中,它還討論了你正面臨的循環依賴。希望這個幫助。 –

+0

好的,謝謝你,這也是我的嘗試和工作,但我認爲這可能是我的應用程序中的結構性問題。不過謝謝,但我正在使用該解決方案接受其他答案。給它一個+1 –