Require.js&木偶:定义包括扩展课程时

时间:2013-05-07 17:12:25

标签: backbone.js requirejs marionette

我正在使用Require.js,Backbone和Marionette开发一个项目,而我文件顶部的define/function调用变得有点荒谬。我想找到一种方法将“包含”移出最顶层的define块,并转移到相关的extend

所以我的结构大致如下:

define(['underscore','jquery','handlebars','someTemplate','someModel',etc...], function(_,$,Handlebars,template,model,etc...){
  var someView = Backbone.Marionette.ItemView.extend({
    // code here
  });
  return someView;
});

因此,当我向文件添加更多视图时,define列表真的,真的很长。我尝试过这样的事情:

var someView = define(['someTemplate','someModel'], function(template, model){
  return Backbone.Marionette.ItemView.extend({
    // code here
  });
]);

但是当我稍后调用它时,someView是未定义的。我做错了,还是不可能?

2 个答案:

答案 0 :(得分:5)

您应该拆分模块。拥有一个非常长的依赖项列表是一个标志,你的模块做了很多。大多数情况下,所有视图需要的是模型或集合,可能还有一些子视图和全局事件总线。

还要考虑需要jQuery,Backbone等。这些是大多数模块中需要的东西,它更容易将它们组合在一个文件中并首先加载它们。要求使用这些文件没有太大的好处,它所做的就是使你的定义部分混乱很多样板。

定义调用btw。不会返回任何为什么someView在示例中未定义的原因。如果您真的想使用此解决方案,则稍后使用require时必须使用someView。但即便如此,将someView置于其自己的模块文件中也更加清晰。

答案 1 :(得分:2)

您可以使用您的require.js配置文件依赖项填充来聚合您的“常见”或需要 模块到一个命名空间:

shim: {
       marionette: {
            deps: ["backbone", "json2", "bootstrap", "backboneRpc"],
            exports: 'Marionette'
        },

        flot_pie: {
            deps: ['jquery', 'charting', 'flot_resize'],
            exports: '$.plot'
        },
  }

所以现在你可以像这样打电话给你所需要的一切:

define([
    'marionette',
    'flot_pie'
],

function(Marionette, graph) {