2012-06-27 8 views
20

Estoy tratando de utilizar de arranque Twitter para obtener los fabricantes de mi DB.Twitter typeahead de arranque (método 'toLowerCase' de la indefinida)

Debido typeahead Twitter arranque no admite llamadas ajax estoy usando este tenedor:

https://gist.github.com/1866577

En esa página hay esta comment que menciona cómo hacer exactamente lo que yo quiero hacer. El problema es cuando ejecuto mi código guardo en conseguir:

Uncaught TypeError: Cannot call method 'toLowerCase' of undefined

Googled vuelta y se encontró intentado cambiar mi archivo de jQuery para ambos usando el minified y no minified, así como la alojado en Google Code y me quedé obteniendo el mismo error

Mi código actualmente es el siguiente:

$('#manufacturer').typeahead({ 
    source: function(typeahead, query){ 
     $.ajax({ 
      url: window.location.origin+"/bows/get_manufacturers.json", 
      type: "POST", 
      data: "", 
      dataType: "JSON", 
      async: false, 
      success: function(results){ 
       var manufacturers = new Array; 
       $.map(results.data.manufacturers, function(data, item){ 
        var group; 
        group = { 
         manufacturer_id: data.Manufacturer.id, 
         manufacturer: data.Manufacturer.manufacturer 
        }; 
        manufacturers.push(group); 
       }); 
       typeahead.process(manufacturers); 
      } 
     }); 
    }, 
    property: 'name', 
    items:11, 
    onselect: function (obj) { 

    } 
}); 

en el campo URL he añadido el

window.location.origin

para evitar cualquier problema como ya se ha discutido en otra pregunta

también antes de que fuera utilizando $.each() y luego decidió utilizar como $.map() recomendado Tomislav Markovski en un similar question

Alguien tiene alguna idea de por qué me siguen dando este problema ?!

Gracias

+0

¿Ha intentado depurar el código JavaScript usando Firebug o las herramientas de desarrollo F12 de IE para encontrar exactamente dónde está tratando de llamar 'toLowerCase()'? –

+0

@Cory usando la herramienta Inspeccionar de Google Chrome Obtengo que el error está en la línea de código de arranque de twitter 1664 Equivalente a la línea 124 en el [tenedor] (https://raw.github.com/gist/1866577/dd58c66be9dcb5b770e7f51a6cff324bec856021/bootstrap- typeahead.js) – mmoscosa

+0

@mmoscosa en Chrome Herramientas de desarrollo Muchos errores de Javascript tienen un menú desplegable con otros errores en el interior y uno de esos errores es la línea en su código donde aparece ese error. El error está asociado con algo en el arranque, pero donde realmente aparece el error está en tu propio código. –

Respuesta

6

ACTUALIZADO/MIRADA revisado en la EMISIÓN: El error que usted ha mencionado "No se puede llamar al método 'toLowerCase' de la indefinida" se me ocurrió cuando utilicé la extensión TYPEAHEAD original en arranque que no soporta AJAX. (como lo ha encontrado) ¿Está seguro de que no se está cargando la extensión typeahead original, en lugar de la versión revisada?

He sido afortunada using this Gist of typeahead que es una ligera variación en el que usted menciona. Una vez que me pasa a que Gist y confirmó que los datos de entrada era bueno (probando que la entrada era una matriz de cadenas en un objeto JS, el problema se fue

Esperanza esto ayuda


Respuesta original.:

La razón por la que se produce el error es porque el valor pasado a la función typeahead matcher no está definido. Eso es solo un efecto secundario al problema real que ocurre entre su entrada y esa función de emparejamiento. tiene un problema. Pruébelo primero para verificar que tiene una matriz válida.

// It appears your array constructor is missing() 
// try the following in your binding code: 
var manufacturers = new Array(); 

Esto es lo que estoy usando para vincular la entrada a typeahead. Confirmé que funciona con tu fork modificada typeahead.

Mi HTML:

<!-- Load bootstrap styles --> 
<link href="bootstrap.css" rel="stylesheet" type="text/css" /> 
... 

<input type="text" class="typeahead" name="Category" id="Category" maxlength="100" value="" /> 

... 
<!-- and load jQuery and bootstrap with modified typeahead AJAX code --> 
<script src="jquery-1.7.2.min.js" type="text/javascript"></script> 
<script src="bootstrap-modified-typeahead.js" type="text/javascript"></script> 

Mi vinculante código JavaScript:

// Matches the desired text input ID in the HTML 
var $TypeaheadInput = $("#Category"); 

// Modify this path to your JSON source URL 
// this source should return a JSON string array like the following: 
// string[] result = {"test", "test2", "test3", "test4"} 
var JsonProviderUrl = "../CategorySearch"; 

// Bind the input to the typeahead extension 
$TypeaheadInput.typeahead({ 
    source: function (typeahead, query) { 
     return $.post(JsonProviderUrl, { query: query }, function (data) { 
      return typeahead.process(data); 
     }); 
    } 
}); 
+0

'new Array' es una taquigrafía válida. JavaScript no requiere paréntesis si no proporciona argumentos a un constructor. – Dennis

+0

Estoy corregido en la matriz. Buscando algo que podría hacer que los datos no estén definidos ... No tengo la capacidad de duplicar la fuente de datos específica, por lo que no estoy seguro de si hay algún otro desajuste. No creo que el código de escritura anticipada sea un problema, porque me funciona. –

+0

Resolví el problema "No se puede llamar al método 'a la Baja de la batería' de indefinido" al jugar con el orden de carga de las secuencias de comandos js (bootstrap, jquery y typeahed). – javanna

1

Sus objetos fabricante no tienen una propiedad "nombre", debe cambiar

property: 'name', 

a

property: 'manufacturer', 
8

En mi caso, obtenía este error exacto, y resultó que la versión de Bootstrap que estaba usando (2.0.4) no admitía el paso de una función a la configuración source.

La actualización a Bootstrap 2.1.1 solucionó el problema.

+0

Estoy usando bootstrap v3.1.1 y estoy enfrentando el mismo problema –

9

TYPEAHEAD esperan una lista de cadena como fuente

$('#manufacturer').typeahead({ 
    source : ["item 1", "item 2", "item 3", "item 4"] 
}) 

En el caso de que quiera utilizar con una lista de objetos. De esta manera usted tendrá que hacer algunos cambios para que funciona

Esto si funciona:

$('#manufacturer').typeahead({ 
    source: function(typeahead, query){ 
     $.ajax({ 
      url: window.location.origin+"/bows/get_manufacturers.json", 
      type: "POST", 
      data: "", 
      dataType: "JSON", 
      async: false, 
      success: function(results){ 
       var manufacturers = new Array; 
       $.map(results.data.manufacturers, function(data){ 
        var group; 
        group = { 
         manufacturer_id: data.Manufacturer.id, 
         manufacturer: data.Manufacturer.manufacturer, 

         toString: function() { 
          return JSON.stringify(this); 
         }, 
         toLowerCase: function() { 
          return this.manufacturer.toLowerCase(); 
         }, 
         indexOf: function (string) { 
          return String.prototype.indexOf.apply(this.manufacturer, arguments); 
         }, 
         replace: function (string) { 
          return String.prototype.replace.apply(this.manufacturer, arguments); 
         } 
        }; 
        manufacturers.push(group); 
       }); 
       typeahead.process(manufacturers); 
      } 
     }); 
    }, 
    property: 'manufacturer', 
    items:11, 
    onselect: function (obj) { 
     var obj = JSON.parse(obj); 

     // You still can use the manufacturer_id here 
     console.log(obj.manufacturer_id); 

     return obj.manufacturer; 
    } 
}); 
+0

Funcionó después de hacer dos correcciones. function (typeahead, query) cambiada a (query, typehead). en lugar de typeahead.process (fabricantes), dio typeahead (fabricantes); Corrígeme si estoy equivocado. –

0

me encontré con este tema hace un tiempo. Le aconsejo que vuelva a verificar la configuración donde está incluyendo las bibliotecas typeahead (a través de main.js, app.js o config.js).

De lo contrario, puede sobrescribir el latest Bootstrap version en la biblioteca de su aplicación.

1

¿Ha intentado utilizar las variables de mapeo como el siguiente ejemplo, necesita usar esto cuando tiene más de una propiedad en su objeto;

source: function (query, process) { 
     states = []; 
     map = {}; 

     var data = [ 
      {"stateCode": "CA", "stateName": "California"}, 
      {"stateCode": "AZ", "stateName": "Arizona"}, 
      {"stateCode": "NY", "stateName": "New York"}, 
      {"stateCode": "NV", "stateName": "Nevada"}, 
      {"stateCode": "OH", "stateName": "Ohio"} 
     ]; 

     $.each(data, function (i, state) { 
      map[state.stateName] = state; 
      states.push(state.stateName); 
     }); 

     process(states); 
    } 
0

Prueba este código:

String.prototype.hashCode = function(){ 
var hash = 0; 
if (this.length == 0) return hash; 
for (i = 0; i < this.length; i++) { 
    char = this.charCodeAt(i); 
    hash = ((hash<<5)-hash)+char; 
    hash = hash & hash; // Convert to 32bit integer 
} 
return hash; 
}; 

var map_manufacter, result_manufacters; 
$('#manufacturer').typeahead({ 
source: function(typeahead, query){ 
    $.ajax({ 
     url: window.location.origin+"/bows/get_manufacturers.json", 
     type: "POST", 
     data: "", 
     dataType: "JSON", 
     async: false, 
     success: function(results){ 

      result_manufacter = [], map_manufacters = {}; 
      $.each(results.data.manufacturers, function(item, data){      
       map_manufacters[data.Manufacturer.manufacturer.hashCode()] = data; 
       result_manufacters.push(data.Manufacter.manufacter); 
      });    
      typeahead.process(result_manufacters);     
     } 
    }); 
}, 
property: 'name', 
items:11, 
onselect: function (obj) { 
    var hc = obj.hashCode(); 
    console.log(map_manufacter[hc]); 
} 

});

2

En mi caso, tuve valores nulos en mi matriz de origen que causaban este error.

ejemplo artificioso:

source : ["item 1", "item 2", null, "item 4"] 
Cuestiones relacionadas