循环参考marionette.js

时间:2013-06-12 15:24:21

标签: javascript backbone.js requirejs marionette

我在marionette.js应用程序中遇到循环引用问题..

问题是:

App.js使用控制器创建路由器,并且该控制器再次需要app.js,以便可以将视图添加到区域中。当我打印{{1}时,您可以在下面看到(控制器)由于循环参考,它返回undefined ..

controller.js:

Application

router.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');
        }
    });
}
);

app.js

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

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

现在解决这个问题的最佳方法是什么?我对此完全陌生,所以我真的不知道最佳做法是什么..

我在控制器中添加视图也是正确的吗?或者我应该在其他地方这样做?

提前致谢

3 个答案:

答案 0 :(得分:4)

我认为你应该将一个区域传递给控制器​​以实现它,你肯定需要移动你的代码。我有一个示例应用程序工作,但没有使用require,但是在控制器中创建一个区域并将一个区域从主应用程序传递给它的概念可以在这里进行demostraded。

 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/

希望有所帮助。

答案 1 :(得分:1)

如果我理解正确,基本上,你有路由器取决于应用程序和控制器依赖于应用程序。

如果是这种情况,您只需将它们分成三个模块:App,Router和Controller。 然后在路由器和控制器模块中定义['app',...]。 Here是我用于JMQ的其他基本代码结构。

更新: 从Using-marionette-with-requirejs开始,它还讨论了“避免循环依赖”

答案 2 :(得分:0)

您可以将ProjectView放入Marionette模块。

有关此类技术的示例,请参阅https://github.com/mallim/backbone_examples/blob/master/app/scripts/cats/module.js

希望这有帮助。