javascript - 如何使用 requireJs 以正确的顺序定义 Controller 、路由器和应用程序

标签 javascript backbone.js requirejs marionette

我正在编写一个小应用程序(initApp.jsinitApp.routinj.jsinitApp.controller.js),模块需要使用requires来加载。
这是我的代码 (*)。
在每个模块中使用 console.log 我发现模块的加载顺序如下:

1) initController 
2) initRouting 
3) initApp 

这个顺序正确吗?

现在还有一个问题。
initApp.controller.js 中,我需要访问 initHeaderinitSidebar 等函数(在 initApp.js 中定义) ).
但正如您从我的代码(initApp.controller.js)中看到的,console.log('initController', app); 返回undefined .
为了解决这个问题,我在 initApp.controller.js 中定义了函数 getApp
但可以肯定的是,有更好的方法来完成这项任务。
有什么想法吗?
谢谢

(*)


** main.js **

define([
    'js/app',
    'js/init/initApp',
//    'js/tasks/tasksApp'
],
function (App)
{
    "use strict";
    App.initialize();
});

** initApp.js **

/*global define*/
define([
    'backbone',
    'js/app',
    'js/init/initApp.routing',
    'js/init/views/sidebarView',
    'js/init/views/headerView',
],
function (Backbone, App, Router, SidebarView, HeaderView)
{
    "use strict";
    console.log('initApp', Router)
    var initApp = new Backbone.Marionette.Application({

        initHeader: function ()
        {
            var headerView = new HeaderView();
            App.header.show(headerView);
        },

        initSidebar: function ()
        {
            var sidebarView = new SidebarView();
            App.sidebar.show(sidebarView);
        }

    });

    return initApp;
});

** initApp.routin,js **

/*global define*/
define([
    'backbone',
    'marionette',
    'js/init/initApp.controller'
],
function(Backbone, Marionette, controller)
{
    "use strict";
    console.log('initRouting', controller)
    var Router = Backbone.Marionette.AppRouter.extend({

        appRoutes: {
            '*defaults': 'index'
        }

    });
    return new Router({
        controller: controller
    });

});

** initApp.controller.js **

/*global define*/
define([
    'js/init/initApp'
],
function(app)
{
    "use strict";
    console.log('initController', app); // undefined
    var getApp = function () {
        var initApp;
        require(['js/init/initApp'], function (app) {
            initApp = app;
        });
        return initApp;
    };

    var controller = {
        index: function ()
        {
            var app = getApp();
            app.initHeader();
            app.initSidebar();
        }
    }

    return controller;

});

最佳答案

不确定这是否是实现事物的正确方法,但是,就您而言,如果您按此顺序加载模块,它将可以工作。

1) initApp
2) initController
3) initRouting

所以这意味着你的 main.js 应该是:

define([
    'js/app',
    'js/init/initApp.routing'
],
function (App)
{
    "use strict";
    App.initialize();
});

关于javascript - 如何使用 requireJs 以正确的顺序定义 Controller 、路由器和应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11070038/

相关文章:

javascript - 在函数内部修改变量后,为什么变量未更改? -异步代码引用

javascript - 如何避免文本字段上有多个事件监听器?

javascript - 主干 View 显示引用错误?

javascript - require.js 和 r.js 依赖项

javascript - RequireJS:优化器为定义模块生成名称

javascript - 如何在 D3 中实现鼠标滚轮缩放,如带有覆盖和 Ctrl + 滚动事件的 Google Map?

javascript - HTML5 和 PHP : Play base 64 encoded video file

javascript - 如何使用 d3.js 制作正确的倒置堆叠图?

backbone.js - 如何解决同一页面上的 browserify(基于 Backbone 的应用程序)和 require.js 之间的冲突?

javascript - require.js : how can I load a module that defines a name under a different name?