我正在使用 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' }
}
我正在通过调用 noConflict()
加载依赖项的本地副本在主干、下划线和 jquery 上。但是,Handlebars 没有 noConflict
方法;如果我尝试以与 backbone & underscore 相同的方式为它配置 shim,我会得到一个错误:
Uncaught TypeError: Object #<c> has no method 'noConflict'
这并不奇怪,但我担心冲突!有解决方法吗?我可以通过编写自己的 noConflict
版本以某种方式手动实现相同的目标吗? Handlebars ?那会是什么样子?
最佳答案
据我了解,noConflict 的目的是释放一些命名空间(或者换句话说,全局变量)。我认为,您可以通过以下方式完成它:
- 向 Handlebars 添加一些伪依赖项(它可能是简单的 AMD 模块, 自己写的)
- 在 Handlebars shim 配置中,按以下方式使用 init 选项:
handlebars : {
deps: ['myFakeModule'],
init: function(myFakeModule) {
myFakeModule.Handlebars = this.Handlebars;
this.Handlebars = undefined;
return myFakeModule.Handlebars;
}
}
这是一个理论,有点老套,但它可以解决问题。
关于javascript - 如何解决 Handlebars.js 缺少 noConflict 方法的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145173/