Backbone JS,Marionette和Require JS

时间:2012-12-14 23:40:26

标签: backbone.js requirejs marionette

我正在尝试使用Backbone和Require JS使用木偶来实现它的一些出色功能。但是,我发现应用程序可用于视图的一些问题:

main.js

require(['application'], function(app){
app.start();
});

的application.js

define([
'marionette',
'router'
], function(marionette, Router){

"use strict";

var app = new marionette.Application();

app.addRegions({
    header : 'header',
    main   : '#main'
});

app.addInitializer(function(){
    this.router = new Router();
});

return app;

});

dashboard.js

define([
'application',
'underscore',
'backbone', 
], function(app, _, Backbone) {
var DashboardView = Backbone.View.extend({

initialize: function() {
    console.log(app);
    $('a').click(function(e){
        e.preventDefault();
        app.router.navigate("claims", {
           trigger: true 
        });
    });
},

});
return DashboardView;
});

我在控制台日志中收到未定义的内容?应用程序应该使用requirejs模块吗?

编辑:使用require更新

require.config({

paths: {
    'jquery'        : '../vendors/jquery-1.8.2',
    'underscore'    : '../vendors/underscore',
    'text'          : '../vendors/text',
    'json2'         : '../vendors/json2',
    'backbone'      : '../vendors/backbone',
    'marionette'    : '../vendors/plugins/backbone.marionette',
    'paginator'     : '../vendors/plugins/backbone.paginator',
    'relational'    : '../vendors/plugins/backbone.relational',
    'moment'        : '../vendors/moment',
    'bootstrap'     : '../vendors/bootstrap',
    'datepicker'    : '../vendors/plugins/bootstrap.datepicker',
    'templates'     : 'templates/'
},

shim: {

    backbone: {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
    },
    marionette : {
        exports : 'Backbone.Marionette',
        deps : ['backbone']
    },
    paginator: {
        deps: [
        'backbone',
        'underscore',
        'jquery'
        ],
        exports: 'Backbone.Paginator'
    },
    relational: ['backbone'],
    underscore: {
        'exports': '_'
    },
    bootstrap: {
        deps: ['jquery'],
        exports: "bootstrap"
    },
    datepicker: {
        deps: ['jquery','bootstrap'],
        exports: "datepicker"
    },
    moment: {
        exports: 'moment'
    }
}

});

require(['application'], function(app){
    app.start();
});

路由器

define([
  'views/claims/PaginatedList',
  'views/dashboard/Dashboard'
  ], function(PaginatedClaimListView, DashboardView){

var Router = Backbone.Router.extend({

    routes: {

        "": "index",
        "claims": "claims"

    },

    initialize: function(){
        Backbone.history.start({
            pushState: true,
            root: '/app_dev.php/hera'
        });
    },

    index: function(){
        var dashboard = new DashboardView();
    },

    claims: function(){
        var claimListView = new PaginatedClaimListView();
    }

});

return Router;

});

3 个答案:

答案 0 :(得分:2)

我想我已经明白了,即使我不是百分之百确定原因。

问题在于您的Router定义。通过引用Application来放置您的视图会使路由器在main.js中调用app.start()之前启动。事实上,如果你在main.js中放置一个console.log(app),你会注意到它在dashboard.js中被调用。

所以这就是我如何解决它:

define(['backbone'], function(Backbone){

var Router = Backbone.Router.extend({

    routes: {
        "": "index",
        "claims": "claims"
    },

    initialize: function(){
        Backbone.history.start({
            pushState: true,
            root: '/app_dev.php/hera'
        });
    },

    index: function(){
        require(['views/dashboard/Dashboard'],function(DashboardView){
            var dashboard = new DashboardView();
        });
    },

    claims: function(){
        require(['views/claims/PaginatedList'],function(PaginatedClaimListView){
             var claimListView = new PaginatedClaimListView();
        });
    }

});

return Router;

});

我不确定是否有一个更好的解决方案可以让您的路由器定义您的视图,无论如何这样做会让您的路由器变得更轻,特别是如果您的视图数量增加...

答案 1 :(得分:0)

我发现通常每当我将Require.js模块设置为undefined时它们不应该是,这是因为循环依赖。例如,让我们说“发泄”取决于“仪表板”;您需要:vent需要dashboard需要application需要vent ...

当发生这种情况时,需要的响应实际上只是选择其中一个文件并使其工作,但循环依赖中涉及的任何其他文件都以undefined形式出现。

您可以通过删除导入来测试此理论,以查看是否修复了您的undefined。另外,需要帮助人员可以下载一个名为xrayquire的工具,它可以帮助找到循环依赖关系。

答案 2 :(得分:0)

您是否必须通过app.router访问路由器?你能不能让仪表板自己需要路由器,并直接访问它?只要应用程序已经执行(它应该具有,那时),那么您不需要通过应用程序访问它。我认为你的问题绝对是一个复杂的循环依赖。