2014-05-06 59 views
0

从日志中,Backbone现在注册AMD(Require.js)自v1.1.1以来的版本。Backbone AMD with requireJs

好,所以我尝试做一个模块相同,但有一些我不明白。

如果我们看section 4 of annotated sources的来源,模块不会返回全局骨干。

没有需要垫片和window.Backbone是可用的。但是骨干怎么不能被定义?

//定义骨干模块

define(['underscore', 'jquery', 'exports'], function(_, $, exports) { 
    root.Backbone = factory(root, exports, _, $); 
}); 

//要求骨干模块

require(['backbone'], function (Backbone) { 
    Backbone // is not undefined ? 
}); 

//模态模块定义

define(['jquery'], function ($) { 
    root.Modal = factory(root, {}, $); 
}); 

//需要模态模块

require(['modal'], function (Modal) { 
    Modal // undefined 
}); 

进入我的模块(使用相同的结构),当我需要我的模块,我得到了undefined如果我不返回任何东西。

我必须返回root.Modal才能使其正常工作。 return root.Modal = factory(root, {}, $);

的主要问题是“怎么能当模块不返回任何需要的模块?

我已经失踪requireJS东西,但我并不觉得。

http://backbonejs.org/docs/backbone.html#section-4

+0

永远不要使用窗口。Backbone,如果它注册为AMD模块,则不需要“填充”,您的文件被命名为“backbone.js”? –

+0

我不使用window.Backbone :) 你说我的模块文件吗?我有相同的文件结构modal.js。 –

+0

如果你在模块内部调用“backbone”,你必须拥有“backbone.js”文件,除非你已经在这个名字之前映射了... –

回答

2

有问题的代码是这样的:

define(['underscore', 'jquery', 'exports'], function(_, $, exports) { 
    root.Backbone = factory(root, exports, _, $); 
}); 

注意现在factory被称为与exports作为第二个参数。工厂函数将通过设置此对象上的字段来导出Backbone的方法。这就是为什么当你需要Backbone时,你会得到一个有用的值,而不是undefined或垃圾。

这个原因,这个工程是RequireJS支持从你给define工厂函数返回一个值定义模块,所以你可以这样做:

define(function() { 
    return { 
     foo: function() { ... } 
    }; 
}); 

但它也支持其他手段来做到这一点,例如像:

define(['exports'], function (exports) { 
    exports.foo = function() { ... }; 
}); 

在依赖项列表命名exports模块上面的代码是一个特殊的(并保留)模块名,意思是“给我一个对象,我可以设置字段出口值”。 骨干使用第二种方式导出值。

+0

谢谢!!!!!非常清楚! –