2013-06-12 124 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 –