循环引用木偶.js

circular reference marionette.js

本文关键字:js 引用 循环      更新时间:2023-09-26

我在我的marionete .js应用程序中有一个循环引用的问题。

问题是:

App.js用一个控制器创建了路由器,这个控制器又需要App.js,这样它才能把视图添加到区域中。如下所示(控制器),当我打印Application时,由于循环引用,它返回未定义。

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

现在解决这个问题的最好方法是什么?我完全是新手,所以我真的不知道最好的做法是什么。

也它是正确的,我在我的控制器添加视图?或者我应该在别的地方做?

Thanks in advance

我认为你应该传递一个区域到控制器在时间实例化它,你肯定需要移动你的代码。我有一个示例应用程序工作,但不需要,但是在控制器中创建一个区域的概念,并从主应用程序传递一个区域到它可以在这里演示。

 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/

希望对你有帮助。

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

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

更新:从using -marionette-with- requirements中,它还讨论了"避免循环依赖"

你可以把ProjectView放到一个木偶模块中。

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