我正在使用Backbone.js和Handlebars.js创建一个Web应用程序(使用Underscore.js和jQuery作为Backbone的依赖项)。我正在使用requirejs为应用程序加载模块。
按照此处的说明操作:
http://requirejs.org/docs/jquery.html#noconflictmap
在这里:
http://requirejs.org/docs/api.html#config
所以我的requirejs配置看起来像:
map: {
'*' : { 'jquery': 'jquery-private' },
'jquery-private': { 'jquery': 'jquery' }
},
shim: {
'underscore' : {
exports: '_',
init: function() { return this._.noConflict(); }
},
'backbone' : {
deps: ['underscore', 'jquery'],
exports: 'Backbone',
init: function(_, $) {
// need to manually set Backbone.$ since it looks for it on the global object
this.Backbone.$ = $;
return this.Backbone.noConflict();
}
},
'handlebars' : { exports: 'Handlebars' }
}
我通过在主干,下划线和jquery上调用noConflict()
来加载我的依赖项的本地副本。但是,Handlebars没有noConflict
方法;如果我尝试以与骨干和放大器相同的方式配置垫片。下划线,我收到一个错误:
Uncaught TypeError: Object #<c> has no method 'noConflict'
那里没有真正的惊喜,但后来我担心冲突!有解决方法吗?通过为Handlebars编写我自己的noConflict
版本,我能以某种方式手动实现相同的目标吗?那会是什么样的?
答案 0 :(得分:0)
据我所知,noConflict的目的是释放一些命名空间(或换句话说,全局变量)。我想,你可以通过以下方式完成它:
handlebars : {
deps: ['myFakeModule'],
init: function(myFakeModule) {
myFakeModule.Handlebars = this.Handlebars;
this.Handlebars = undefined;
return myFakeModule.Handlebars;
}
}
这是一个理论而且有点hacky,但它可能会成功。