2

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

main.js

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

应用程序.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;

});

仪表板.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.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;

});
4

3 回答 3

2

我想我已经弄清楚了,即使我不是 100% 确定原因。

问题在于你的Router定义。在 main.js 中调用参考将您的视图放在那里Application使路由器在之前启动。app.start()事实上,如果你console.log(app)在 main.js 中加入 a,你会注意到它在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;

});

我不确定是否有更好的解决方案可以让您在路由器中定义您的视图,无论如何这会起作用并且会使您的路由器更轻,特别是如果您的视图数量增加...

于 2012-12-16T12:54:07.497 回答
0

我发现,通常每当我将 Require.js 模块设置为undefined不应该设置的时间时,都是因为循环依赖。例如,假设“vent”依赖于“dashboard”;你会有:vent需要dashboard需要application需要vent...

发生这种情况时,Require 的响应基本上只是选择其中一个文件并使其工作,但循环依赖中涉及的任何其他文件都以undefined.

您可以通过删除导入来测试这个理论,看看是否可以修复您的undefined. 或者,Require 人员可以下载一个名为 xrayquire 的工具,该工具有助于查找循环依赖项。

于 2012-12-14T23:55:37.840 回答
0

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

于 2013-07-05T17:21:10.293 回答