2012-04-26 16 views
6

Sto lavorando su un piccolo progetto di apprendimento e ho riscontrato un problema che non riesco a risolvere.Messaggio di errore Jquery/Handlebars - Uncaught TypeError: Object [oggetto Object] non ha alcun metodo 'match'

ottengo il seguente messaggio di errore su google console chromes dev: -

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 

Ora, questo si presenta a un errore con il seguente codice nel manubrio scrips

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

Quindi quello che prendo da questo è che ci deve essere un problema con il mio codice e non con il codice manubrio, anche se è in versione beta.

Ecco la sezione del codice che ha dato il via a tutto.

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(); 
} 

Ho passato ore a cercare di lavorare questo fuori me stesso e ho avuto quasi la stessa sezione di codice a lavorare in un'altra parte del mio sito.

Po 'di fondo - Sto usando php per tirare un database da MySQL e poi per interrogare il database in base a come input degli utenti e jQuery per sovrapporre i campi indietro sulla pagina.

+2

Trovato la correzione. Ho lasciato il .html() per la seguente dichiarazione JobInfoTemplate: $ ('# job_info_template'). Html(). – monkeylumps

+1

Stavo avendo lo stesso problema e la tua risposta lo ha risolto per me. Per i posteri devi inviarlo come risposta a questa domanda e poi accettarlo. :) –

risposta

9

Ciò accade se si tenta di compilare un modello da un oggetto elemento jQuery anziché da una stringa. Per esempio

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

e poi

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

È possibile che questo per far saltare subito, ma non è così. Invece dovrebbe essere

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

match si applica solo alla stringa. Devi applicarlo al valore dell'input. Se si tratta di un oggetto jQuery, è possibile utilizzare _input.val() altrimenti _input.value dovrebbe funzionare.

D'altra parte, poiché fa parte della libreria, è possibile controllare quale tipo di dati è previsto come input e cosa si sta effettivamente inviando.

null per esempio è un oggetto in javascript, quindi è probabile che tu voglia cambiarlo in una stringa vuota se la libreria non la gestisce.

+0

l'istruzione match è parte del codice sorgente del manubrio quindi non vedo il problema. http: // handlebarsjs.com/- Avevo quasi lo stesso codice di lavoro con diversi veriable quindi so che funziona. Ho controllato tutto ciò a cui riesco a pensare. – monkeylumps

3

Se si ottiene il modello come text/html, il modello potrebbe essere un htmlDocument. Se si inizializza il modello come segue, funzionerà correttamente.

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; 
    } 
}); 

}

Se si utilizza il parametro di risposta invece di jqHXR.responseText allora si otterrà il "match" non trovato. L'ho provato

+1

Strano, quando ho iniziato ad usare codice simile, la compilazione dal parametro "risposta" andava bene ... e poi ha iniziato a fallire. Passare a jqXHR.responseText ha fatto il trucco. Grazie! – jabbett

Problemi correlati