2014-01-15 3 views
2

Backbone.js와 Handlebars.js (Backbone에 대한 종속성으로 Underscore.js 및 jQuery 사용)를 사용하여 웹 응용 프로그램을 만들고 있습니다. 나는 requirejs와 함께 애플 리케이션을위한 모듈을로드하고있다. 내가 로컬 복사본을로드하고있어Handlebars.js에서 noConflict 메소드가 부족한 이유는 무엇입니까?

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' } 
    } 

: 여기

http://requirejs.org/docs/jquery.html#noconflictmap

과 :

여기에 지침을 다음과 같이

http://requirejs.org/docs/api.html#config

그래서 내 requirejs의 설정 보인다 내 depen 백본, 밑줄 및 jquery에서 noConflict()을 호출하여 그러나 Handlebars에는 noConflict 메서드가 없습니다. 이

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

없음 진짜 놀람, 그러나 나는 충돌에 대한 걱정 : 나는 백본 & 밑줄과 같은 방법에 대한 심의를 구성하려고하면, 나는 오류가 발생하지 않습니다! 해결 방법이 있습니까? Handlebars에 대해 noConflict의 고유 한 버전을 작성하여 어떻게 든 수동으로 동일한 목표를 달성 할 수 있습니까? 그게 어떻게 생겼어?

답변

0

제가 이해하는 것처럼 noConflict의 목적은 일부 네임 스페이스 (또는 글로벌 변수)를 해제하는 것입니다. 난 당신이 다음과 같은 방법으로 그것을 달성 할 수 생각 :

  1. 은 가짜 의존성을 핸들에 추가 다음과 같은 방법으로 핸들 바의 심 설정에서
  2. 사용 초기화 옵션 (이 직접 작성한 간단한 AMD 모듈, 수 있습니다) :

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

이것은 이론과 약간 해키이지만, 수도 속임수를 써라.

+1

이 예를 들어, 바로 글로벌'Backbone'에'undefined'를 설정하지 않습니다, 백본에서'noConflict'을 올바른 궤도에있을 것 같지만. 오히려 * 백본이 모듈을 초기화하기 전에 정의 되었다면 전역 백본을 이전 값으로 복원합니다. 사용자가 제어하지 않는 페이지에 삽입하는 경우 해당 페이지에 이미있는 백본 버전을 덮어 쓰지 않으려는 것입니다. – gregates

관련 문제