2014-01-15 38 views
2

我使用Backbone.js和Handlebars.js(使用Underscore.js和jQuery作爲Backbone的依賴關係)創建Web應用程序。我使用requirejs爲應用程序加載模塊。我該如何解決Handlebars.js缺少noConflict方法的問題?

繼此份說明:

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()來拒絕。但是,把手沒有noConflict方法;如果我試圖以同樣的方式配置墊片它作爲骨幹&下劃線,我得到一個錯誤:

Uncaught TypeError: Object #<c> has no method 'noConflict'

沒有真正有驚喜,但我很擔心衝突!有沒有解決方法?我可以通過編寫我自己版本的Handlebars noConflict手動實現相同的目標嗎?那將是什麼樣子?

回答

0

據我所知,noConflict的目的是釋放一些命名空間(或換句話說,全局變量)。我想,你可以在下面的方式完成它:

  1. 添加到車把一些假的依賴(這可能是簡單的AMD模塊, 自己寫的)在車把墊片配置
  2. ,以下列方式使用init選項:

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

這是一個理論,有點哈克,但它可能做的伎倆。

+1

這似乎是在正確的軌道上,但是在Backbone中'noConflict'並不只是將全局'Backbone'設置爲'undefined'。相反,如果在初始化模塊之前定義了* Backbone,它會將全局'Backbone'恢復到之前的值。這個想法是,如果你嵌入在你不能控制的頁面中,你不想覆蓋該頁面上可能已經存在的任何版本的Backbone。 – gregates

相關問題