0

我正在使用 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当我稍后调用它时,它是未定义的。我做错了吗,还是不可能?

4

2 回答 2

5

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

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

顺便说一句,定义调用。不返回任何内容,这就是someView示例中未定义的原因。如果您真的想使用此解决方案,则必须在以后使用require时使用someView。但即便如此,将其放入someView自己的模块文件中也更干净。

于 2013-05-07T19:26:34.243 回答
2

您可以使用您的 require.js 配置文件依赖项 shim 将您的“通用”或所需模块聚合到一个命名空间中:

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) {
于 2013-05-07T22:08:26.280 回答