2013-09-06 8 views
6

Sto utilizzando typeahead.js su un progetto di Google App Engine e ho problemi con l'uso di prefetch.typeahead.js precarichi problemi

Il typeahead funziona bene quando utilizzo local, ma se copio lo stesso set di dati in un file JSON e uso prefetch, il typeahead non funziona, cioè non vengono visualizzati suggerimenti.

Ecco la mia versione del codice utilizzando locali:

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Demo</title> 
</head> 
<body> 
    <div><input type="text" name="typeahead-example" placeholder="Type here" class="typeahead-example"></div> 
    <script src="./js/jquery-1.10.2.js" type="text/javascript"></script> 
    <script src="./js/hogan.js" type="text/javascript"></script> 
    <script src="./js/typeahead.min.js" type="text/javascript"></script> 
    <script> 
     $(document).ready(function(){ 
       $('input.typeahead-example').typeahead({ 
        name: 'example', 
        local: [{value: 'Abc Def', tokens: ['Abc', 'Def'], name: 'random1', val2: 'A', val3: 'B'}, 
        {value: 'Def Ghi', tokens: ['Def', 'Ghi'], name: 'random2', val2: 'C', val3: 'D'}, 
        {value: 'Ghi Jkl', tokens: ['Ghi', 'Jkl'], name: 'random3', val2: 'E', val3: 'F'}, 
        {value: 'Jkl Mno', tokens: ['Jkl', 'Mno'], name: 'random4', val2: 'G', val3: 'H'}], 
        limit: 3, 
        valueKey: 'name', 
        template: '<p>{{value}}</p>', 
        engine: Hogan 
       }); 
      }); 
    </script> 
</body> 
</html> 

Ecco la mia versione del codice utilizzando prefetch:

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Demo</title> 
</head> 
<body> 
    <div><input type="text" name="typeahead-example" placeholder="Type here" class="typeahead-example"></div> 
    <script src="./js/jquery-1.10.2.js" type="text/javascript"></script> 
    <script src="./js/hogan.js" type="text/javascript"></script> 
    <script src="./js/typeahead.min.js" type="text/javascript"></script> 
    <script> 
     $(document).ready(function(){ 
       $('input.typeahead-example').typeahead({ 
        name: 'example', 
        prefetch: {url: './json/example.json', ttl: '0'}, 
        limit: 3, 
        valueKey: 'name', 
        template: '<p>{{value}}</p>', 
        engine: Hogan 
       }); 
      }); 
    </script> 
</body> 
</html> 

Ecco il file example.json:

[{value: 'Abc Def', tokens: ['Abc', 'Def'], name: 'random1', val2: 'A', val3: 'B'}, {value: 'Def Ghi', tokens: ['Def', 'Ghi'], name: 'random2', val2: 'C', val3: 'D'}, {value: 'Ghi Jkl', tokens: ['Ghi', 'Jkl'], name: 'random3', val2: 'E', val3: 'F'}, {value: 'Jkl Mno', tokens: ['Jkl', 'Mno'], name: 'random4', val2: 'G', val3: 'H'}] 

Il problema si verifica in Chrome e Firefox. Debug in chrome, posso vedere che il file example.json è servito e ricevuto. L'anteprima e la risposta dell'attività di rete ad esempio.json mostra il contenuto del file nella sua interezza. Tuttavia, nella sezione delle risorse del debugger di Chrome, Local Storage è vuoto. Non ci sono errori di console, proprio questo messaggio

XHR finished loading: "http://localhost:8000/json/example.json". jquery-1.10.2.js:8706 
send jquery-1.10.2.js:8706 
jQuery.extend.ajax jquery-1.10.2.js:8136 
jQuery.(anonymous function) jquery-1.10.2.js:8282 
jQuery.extend.getJSON jquery-1.10.2.js:8265 
c.mixin._loadPrefetchData typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
c.mixin.initialize typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
(anonymous function) typeahead.min.js:7 
jQuery.extend.map jquery-1.10.2.js:782 
g typeahead.min.js:7 
jQuery.extend.each jquery-1.10.2.js:657 
jQuery.fn.jQuery.each jquery-1.10.2.js:266 
b.initialize typeahead.min.js:7 
jQuery.fn.typeahead typeahead.min.js:7 
(anonymous function) prefetch.html:14 
fire jquery-1.10.2.js:3048 
self.fireWith jquery-1.10.2.js:3160 
jQuery.extend.ready jquery-1.10.2.js:433 
completed 

Per quanto riguarda this post, non sto avendo problemi di dominio incrociati e per quanto riguarda this post, ho impostato TTL a 0 e il problema persiste.

Qualsiasi aiuto sarebbe apprezzato.

  • AGGIORNAMENTO * In risposta al suggerimento @NitzanShaked ho aggiunto un po 'di logging console.

Prima ho provato questo e nulla registrato nella console.

$(document).ready(function(){ 
    $('input.typeahead-example').typeahead({ 
     name: 'example', 
     prefetch: { 
     url: './json/example.json', 
     ttl: '0', 
     filter: function (data) { 
      console.log(data); 
      for (var i = 0; i < data.length; i++) { 
       datum = data[i]; 
       console.log(datum); 
      } 
      return data; 
     } 
     }, 
     limit: 3, 
     valueKey: 'name', 
     template: '<p>{{value}}</p>', 
     engine: Hogan, 
    }); 
}); 

Poi ho provato questo:

$(document).ready(function(){ 
    $('input.typeahead-example').typeahead({ 
     name: 'example', 
     prefetch: {url: './json/example.json', ttl: '0'}, 
     limit: 3, 
     valueKey: 'name', 
     template: '<p>{{value}}</p>', 
     engine: Hogan, 
    }).bind('typeahead:opened', function (obj, datum) { 
       console.log(obj); 
       console.log(datum); 
       console.log(datum.val2); 
       }); 
}); 

che ha causato la console per accedere alla seguente quando si fa clic all'interno del campo di input

jQuery.Event {type: "typeahead:opened", timeStamp: 1378502920480, jQuery1102039872112357988954: true, isTrigger: 3, namespace: ""…} 
currentTarget: input.typeahead-example tt-query 
data: null 
delegateTarget: input.typeahead-example tt-query 
handleObj: Object 
isTrigger: 3 
jQuery1102039872112357988954: true 
namespace: "" 
namespace_re: null 
result: undefined 
target: input.typeahead-example tt-query 
timeStamp: 1378502920480 
type: "typeahead:opened" 
__proto__: Object 
prefetch.html:22 
undefined prefetch.html:23 
Uncaught TypeError: Cannot read property 'val2' of undefined prefetch.html:24 
(anonymous function) prefetch.html:24 
jQuery.event.dispatch jquery-1.10.2.js:5095 
elemData.handle jquery-1.10.2.js:4766 
jQuery.event.trigger jquery-1.10.2.js:5007 
(anonymous function) jquery-1.10.2.js:5691 
jQuery.extend.each jquery-1.10.2.js:657 
jQuery.fn.jQuery.each jquery-1.10.2.js:266 
jQuery.fn.extend.trigger jquery-1.10.2.js:5690 
c.mixin.trigger typeahead.min.js:7 
c.mixin._propagateEvent typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
d.trigger typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
c.mixin.open typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
c.mixin._openDropdown typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
d.trigger typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
c.mixin._handleFocus typeahead.min.js:7 
proxy jquery-1.10.2.js:827 
jQuery.event.dispatch jquery-1.10.2.js:5095 
elemData.handle 
+0

Prova a non specificare 'name' per il set di dati di prefetch (' "esempio" 'nel tuo caso), solo per essere sicuro che non venga importato dalla memoria locale. –

+0

@NitzanShaked, grazie per il suggerimento. Ho provato questo, ma non ho fatto la differenza – rusty1042

+0

Aggiungi un 'filter', quindi, e usa' console.log' per stampare il parametro. Guarda che ha senso. Se lo fa, prova a restituire un dato fittizio da 'filtro' solo per vedere che funziona. –

risposta

13

tuo problema è in example.json, a quanto pare fuori ... È necessario citare i nomi dei tasti usando virgolette doppie e tutte le stringhe (ad esempio in tokens) devono essere citate tra virgolette.

Ad esempio, questo funziona per me:

[{"value": "Abc Def", "tokens": ["Abc", "Def"], "name": "random1", "val2": "A", "val3": "B"}] 

Sarebbe anche saggio cambiare il url./json/example.json-/json/example.json (togliere il punto iniziale).

+0

Questo lo ha fatto - grazie! Strano che 'local' abbia riconosciuto il set di dati senza le virgolette. – rusty1042

+0

Sono contento. Sentiti libero di votare e accettare la risposta se risolvesse il problema. –

+0

Accettato - ancora un gruppo di scambio noob, quindi ho bisogno di più rappresentanti per upvote, ma lo farò una volta arrivato – rusty1042

6

@diddleboo local riconosciuto il set di dati senza le virgolette perché in quel momento si sta utilizzando JavaScript Object letterale, e questa non è la stessa cosa di un JSON.

Oggetto JavaScript letterale è solo un object in ambiente Javascript e le specifiche del linguaggio indicano che non sono richieste virgolette doppie per denominare le proprietà degli oggetti.

Mentre

JSON sta per JavaScript Object Notation. È un formato per il trasferimento dei dati e la sua sintassi richiede virgolette per un nome di proprietà. Dai un'occhiata qui per ulteriori informazioni sulla definizione JSON http://en.wikipedia.org/wiki/JSON

+0

Grande chiarezza aggiunta alla causa principale del problema. – rusty1042

Problemi correlati