2012-04-26 7 views
6

저는 약간의 학습 프로젝트를 진행 중이며 해결할 수없는 문제가 발생했습니다.Jquery/Handlebars 오류 메시지 - 잡히지 않은 TypeError : Object [object Object]에 '일치하는 메서드가 없습니다.'

Uncaught TypeError: Object [object Object] has no method 'match' 
lexer.nexthandlebars-1.0.0.beta.6.js:364 
lexhandlebars-1.0.0.beta.6.js:392 
lexhandlebars-1.0.0.beta.6.js:214 
parsehandlebars-1.0.0.beta.6.js:227 
Handlebars.parsehandlebars-1.0.0.beta.6.js:507 
compilehandlebars-1.0.0.beta.6.js:1472 
(anonymous function)handlebars-1.0.0.beta.6.js:1481 
(anonymous function)scripts.js:103 
jQuery.Callbacks.firejquery.js:1046 
jQuery.Callbacks.self.fireWithjquery.js:1164 
donejquery.js:7399 
jQuery.ajaxTransport.send.callback 

지금이

match = this._input.match(this.rules[rules[i]]); 
Uncaught TypeError: Object [object Object] has no method 'match' 

그래서 내가 어떤 걸릴 핸들의 scrips에 다음 코드와 오류에 나타난다 -이 :

나는 구글의 Chromes dev에 콘솔에 다음과 같은 오류 메시지가 베타 버전이지만 핸들 바 코드가 아니라 내 코드에 문제가 있어야한다는 것입니다.

다음은이 코드를 모두 실행 한 코드 섹션입니다.

displayJobInfo: function(e) { 
    var self = Actors; 

    self.config.jobInfo.slideUp(300); 
    var jobnum = $(this).data('job_id'); 
    $.ajax({ 
     data: { job_id: jobnum } 

    }).then(function(results) { 
     self.config.jobInfo.html(self.config.JobInfoTemplate({ jobs: results, job_id: jobnum })).slideDown(300); 
    }); 
    console.log($(this).data('job_id')); 
    e.preventDefault(); 
} 

나는 혼자 힘으로 노력하고 많은 시간을 보내고 내 사이트의 다른 부분에서 거의 동일한 코드 섹션을 사용하고 있습니다.

약간의 배경 - 내가 PHP를 사용하여 MySQL에서 데이터베이스를 가져온 다음 사용자 입력 및 jquery를 기반으로 데이터베이스를 쿼리하여 페이지에 다시 필드를 오버레이합니다.

+2

수정 사항을 발견했습니다. 나는 다음 문 JobInfoTemplate에 대해 .html()을 생략했다. $ ('# job_info_template') .html(). – monkeylumps

+1

나는 똑같은 문제를 겪고 있었고 당신의 대답이 그것을 해결했습니다. 후손을 위해이 질문에 대한 답변으로 제출 한 다음 동의해야합니다. :) –

답변

9

문자열 대신 jquery 요소 개체에서 템플릿을 컴파일하려고하면 이러한 문제가 발생합니다. 예를

<script id="my-template-script" type="text/template">...</script> 

다음

var my_template = Handlebars.compile($("#my-template-script")); // WRONG 

를 들어 당신이 바로 날려 예상 할 수 있지만, 그렇지 않습니다. 대신

1

match은 문자열에만 적용됩니다. 입력 값에 적용해야합니다. jQuery 객체 인 경우 _input.val()을 사용할 수 있습니다. 그렇지 않으면 _input.value이 작동합니다.

한편, 라이브러리의 일부인 것처럼, 입력으로 예상되는 데이터 유형과 실제로 보내고있는 데이터 유형을 확인할 수도 있습니다.

null은 자바 스크립트의 객체이므로 라이브러리가 처리하지 않으면 빈 문자열로 변경하려고합니다.

+0

match 문은 핸들 바 소스 코드의 일부이므로 문제가되는 것을 보지 못했습니다. http : // handlebarsjs.co.kr/- 나는 거의 동일한 코드를 differentant veriable으로 작업 했으므로 작동한다는 것을 알고 있습니다. 나는 내가 생각할 수있는 모든 것을 조사했다. – monkeylumps

3

템플릿을 text/html로 가져 오는 경우 템플릿은 htmlDocument 일 수 있습니다. 다음과 같이 템플릿을 초기화하면 정상적으로 작동합니다.

function getTemplate(templateName,context, callback, errorCallback) { 
var template = {}; 
template.name = templateName; 
$.ajax({ 
    url: templateName, 
    timeout: 1000, 
    datatype: "text/javascript", 
    error: function(jqXHR, textStatus, errorThrown) { 
     errorCallback && errorCallback.call(context, textStatus); 
    }, 
    success:function(response, textStatus, jqXHR) { 
     try { 
      template['handlebar'] = Handlebars.compile(jqXHR.responseText); 
     } catch(e) { 
      console.error("error while creating Handlebars script out of template for [", template, e); 
      throw e; 
     } 
     template['rawTemplate'] = jqXHR.responseText; 
     callback && callback.call(context, template); 
     return response; 
    } 
}); 

}

당신은 당신이 "일치"를 얻을 것이다 대신 jqHXR.responseText의 응답 PARAM를 사용하는 경우를 찾을 수 없습니다. 나는 그것을 시도했다.

+1

이상하게도 비슷한 코드를 사용하기 시작했을 때 "응답"매개 변수에서 컴파일하는 것이 좋았습니다 ... 그리고 나서 실패하기 시작했습니다. jqXHR.responseText로 전환하면 트릭이 발생했습니다. 감사! – jabbett

관련 문제