2014-01-09 4 views
0

js 프로젝트에서 백본, requirejs 및 핸들 바를 사용하여 일종의 템플릿 로더 클래스를 만들려고합니다. 상기,RequireJs exporting Handlebars templates

[...] 
    addTemplate : function (path,name) 
    {   
     //_templates is an array defined outside 
     _templates[name] = require([path],function(tpl){ 
     result = Handlebars.compile(tpl); //this is a Handlebar compiled template 
     return result; 
     }); 

     console.log(_templates[name]); // returns the js code of the require function (i think)        
    }, 
    [...other stuff...] 

너무 :

목적은 내가이이 동적으로 클래스 내부

something.addTemplate('text!path/to/template','templateName'); 

처럼 핸들의 응용 프로그램에서 템플릿 및 설정 파일에서 하지를로드하는 것입니다 addTemplate 함수의 끝 _templats [이름] 않습니다 컴파일 된 템플릿을 포함 ...

나를 도와 줄 수 있습니까?

편집

내가 자세한 내용과 질문을 업데이트 채팅에 몇 가지 제안을 점점 후 :

내가 달성하기 위해 노력하고있어, 한 번만 그들이 처음 핸들 템플릿을 컴파일하는 것입니다 라는.

내가 할 수있는 일은 코드 어딘가에있을 수 있다는 것입니다. templatemanager.addTemplate ('path', 'name'); // requirejs를 사용하여 파일을로드하고 핸들 바를 사용하여 파일을 컴파일 한 다음 템플릿 관리자에 저장합니다

과 같은 작업을 수행 할 수 있도록 다른 곳에서 가능합니다. templatemanager.getTemplate ('name');

컴파일 된 핸들 모음 템플릿을 반환합니다.

나는 requirejs의 비동기 특성으로 인해 addtemplate과 지연된 객체와 약속을 사용하는 getTemplate 모두에서 "무언가"해야한다고 생각합니다.

그게 뭔가?

EDIT 2

제가 부분적 기능 리팩토링 해결. 나는 다른 사람이 같은 문제를 겪고 있다면 여기에 적는다.

addTemplate : function (path,name) 
    {   
     var deferred = $.Deferred(); 

     require([path],function(tpl){ 
     _templates[name] = Handlebars.compile(tpl);           
     deferred.resolve(_templates[name]);      
     }); 

     return deferred.promise(); 
    } 

답변

3

문제는 기능이 비동기 적이라는 것이다. 해당 콜백은 console.log 다음에 실행됩니다.

promise을 사용할 수 있습니다.

addTemplate : function (path,name) 
    { 
     var deferred = $.Deferred(); 
     //_templates is an array defined outside 
     _templates[name] = require([path],function(tpl){ 
     result = Handlebars.compile(tpl); //this is a Handlebar compiled template 
     //return result; 
     deferred.resolve(result); 
     }); 

     console.log(_templates[name]); // returns the js code of the require function (i think) 
     return deferred.promise(); 
    }, 

단일 서식로드 여러 템플릿로드

addTemplate(path, name).then(function() { 
    console.log('template added'); 
} 

VAR deferredArray = [];

for (...) { 
    deferredArray.push(addTemplate(path, name)); 
} 
$.when.apply($, deferredArray).then(function(result) { 
    console.log('template added'); 
}); 
+0

더 자세히 설명해 주시겠습니까? jquery Deferred/약속 (예 :)을 내 코드와 "병합"하는 방법을 이해할 수 없습니다. 또한 requirejs가로드를 완료하면 두 번째 매개 변수로 전달 된 함수가 실행됩니다. 하지만 그 함수 내부에 _templates 변수를 전달할 수 없습니다. – Stormsson

+0

@Stormsson이 예제와 함께 대답을 업데이트했습니다. –

+0

@Stormsson이 콜백을 호출 한 사람이 아니기 때문에 콜백 함수가 필요하도록 자신의 매개 변수를 전달할 수 없습니다. 이 콜백을 호출하고 모든 매개 변수를 전달하는 것은 RqeuireJs입니다. –