Wol*_*mec 13 requirejs backbone.js
我正在开发一个新的Web应用程序.
这是我第一次使用带有AMD模块的requirejs.
要习惯那种新的范例并不容易 - 据我所知 - 全局命名空间中没有变量.
在以前的Web应用程序中,我总是在全局命名空间中有一个变量,我可以用它来跨不同模块共享多个资源.
现在使用requirejs AMD模块,我使用backbone.js和jquery(两个amd版本 - jquery 1.7.1和backbone.js 0.5.3-optamd3).
在我的应用程序的某处,我从服务器(用户对象)获取backbone.js模块.我想从不同的AMD模块访问该模块.我还想拥有一个应用程序范围的事件对象.
你能告诉我:在requirejs AMD中,在不同模块之间共享资源的正确方法是什么?
Wol*_*mec 31
我自己找到了解决方案.
谢谢你,IntoTheVoid,你的答案,但我希望有类似AMD的解决方案.这意味着,不再"污染"全局命名空间.
我的解决方案有两个关键:
" https://github.com/addyosmani/backbone-aura "从阿迪奥斯马尼和" https://github.com/amdjs/amdjs-api/wiki/AMD "的异步模块定义(AMD)API规范.
规范说:"如果工厂是一个功能,它应该只执行一次."
因此,如果AMD模块多次指定为一个Web应用程序的依赖,依赖关系不仅没有加载多次,也不会执行多次,这是新的东西给我.它只执行一次,并保留工厂功能的返回值.具有相同路径的每个依赖项具有相同的对象.而这改变了一切.
因此,您只需定义以下amd模块:
define([], function() {
var app_registry = {};
app_registry.global_event_obj = _.extend({}, Backbone.Events);
app_registry.models = {};
return app_registry;
});
Run Code Online (Sandbox Code Playgroud)
现在,在您要共享资源的那些模块中,将此app_registry模块声明为依赖项并写入一个:
define(['jquery','underscore','backbone','app_registry'],
function ($, _, Backbone, app_registry){
var firstView = Backbone.View.extend({
initialize: function() {
_.bindAll (this, 'methodOne');
this.model.bind ('change', this.methodOne);
this.model.fetch();
},
methodOne: function() {
app_registry.models.abc = this.model;
}
...
Run Code Online (Sandbox Code Playgroud)
在另一个:
define(['jquery','underscore','backbone','app_registry'],
function ($, _, Backbone, app_registry){
var secondView = Backbone.View.extend({
initialize: function() {
_.bindAll (this, 'methodTwo');
app_registry.global_event_obj.bind ('special', this.methodTwo);
},
methodTwo: function() {
app_registry. ...
}
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5983 次 |
| 最近记录: |