【问题标题】:circular reference marionette.js循环引用 marionette.js
【发布时间】:2013-06-12 15:24:20
【问题描述】:

我的 marionette.js 应用程序中的循环引用有问题..

问题是:

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

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;
    }
);

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

在控制器中添加视图是否正确?还是我应该在其他地方这样做?

提前致谢

【问题讨论】:

  • 能否请您发布您的应用文件?
  • 是的,我已经添加了,请看一下 :)

标签: javascript backbone.js requirejs marionette


【解决方案1】:

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

 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/

希望对您有所帮助。

【讨论】:

  • 所以基本上只是将区域作为控制器的参数传递?我要试试这个
  • 这很好,但是我正在等待接受这个答案,直到我有更多关于模块的其他答案的信息。
【解决方案2】:

如果我理解正确的话,本质上,你的路由器依赖于应用程序,控制器依赖于应用程序。

如果是这样,你只需将它们分成三个模块,App、Router 和 Controller。 然后在 Router 和 Controller 模块中定义 ['app',...] 。 Here 是我用于 JMQ 的其他一些基本代码结构。

更新: 来自Using-marionette-with-requirejs,还讨论了“避免循环依赖”

【讨论】:

  • 你的意思是 github.com/marionettejs/backbone.marionette/blob/master/docs/… 的模块?我什么时候必须调用这些模块,你能否添加更多信息,因为我不明白。谢谢!
  • 我提到了 requirejs 模块,你可以在这里阅读如何将 requirejs 与木偶一起使用。 github.com/marionettejs/backbone.marionette/wiki/… 在这个 wiki 中,它还讨论了您所面临的循环依赖.. 希望对您有所帮助。
  • 好的,谢谢,这也是我尝试和工作的方法,但我认为这可能是我的应用程序中的结构性问题。不过谢谢,但我会接受另一个答案,因为我正在使用该解决方案。给它+1
【解决方案3】:

您可以将 ProjectView 放入木偶模块中。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多