首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环引用marionette.js

循环引用marionette.js
EN

Stack Overflow用户
提问于 2013-06-12 23:24:21
回答 3查看 736关注 0票数 4

我的marionette.js应用程序中的循环引用出现问题。

问题是:

App.js创建带有控制器的路由器,该控制器再次需要app.js,以便可以将视图添加到区域。正如您在下面(控制器)看到的那样,当我打印Application时,由于循环引用,它返回undefined。

controller.js:

代码语言:javascript
复制
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:

代码语言:javascript
复制
   define
    (
        ['marionette'],
        function(Marionette)
        {
            'use strict';

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

app.js

代码语言:javascript
复制
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;
    }
);

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

另外,我在控制器中添加视图是正确的吗?或者我应该在别的地方做呢?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-13 01:03:32

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

代码语言:javascript
复制
 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/

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2013-06-13 11:25:09

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

如果是这样的话,您只需将它们分为三个模块: App、Router和Controller。然后定义'app',...在路由器和控制器模块中。Here是我在JMQ中使用的其他一些基本代码结构。

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-13 09:58:27

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

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

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17069337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档