我如何解决Handlebars.js缺少noConflict方法?

时间:2014-01-15 18:13:33

标签: javascript requirejs handlebars.js

我正在使用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版本,我能以某种方式手动实现相同的目标吗?那会是什么样的?

1 个答案:

答案 0 :(得分:0)

据我所知,noConflict的目的是释放一些命名空间(或换句话说,全局变量)。我想,你可以通过以下方式完成它:

  1. 添加到Handlebars一些假依赖(它可能是简单的AMD模块, 自己写的)
  2. 在Handlebars shim config中,按以下方式使用init选项:

  3. handlebars   : {
       deps: ['myFakeModule'],
       init: function(myFakeModule) {
          myFakeModule.Handlebars = this.Handlebars;
          this.Handlebars = undefined;
          return myFakeModule.Handlebars;
       }
    }
    

    这是一个理论而且有点hacky,但它可能会成功。