UPDATEtypeahead v0.10.2 & Bloodhound - Lavorare con nidificate JSON Oggetti
Sulla base della risposta corretta da @BenSmith (https://stackoverflow.com/users/203371/BenSmith) sono stato in grado di trovare il mio problema e scoperto che non ero la navigazione attraverso il mio JSON gerarchia correttamente. Ecco il codice di lavoro:
// instantiate the bloodhound suggestion engine
var engine = new Bloodhound({
datumTokenizer: function (datum) {
return Bloodhound.tokenizers.whitespace(datum.title);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: "SampleData.json",
filter: function (data) {
//console.log("data", data.response.songs)
return $.map(data.response.songs, function (song) {
return {
title: song.title,
artistName: song.artist_name
};
});
}
}
});
// initialize the bloodhound suggestion engine
engine.initialize();
// instantiate the typeahead UI
$('#prefetch .typeahead').typeahead(
{
hint: true,
highlight: true,
minLength: 1
},
{
name: 'engine',
displayKey: 'title',
source: engine.ttAdapter(),
templates: {
empty: [
'<div class="empty-message">',
'unable to find any results that match the current query',
'</div>'
].join('\n'),
suggestion: Handlebars.compile('<p><strong>{{title}}</strong> by {{artistName}}</p>')
}
});
Grazie @BenSmith per l'aiuto!
domanda iniziale
Sono nuovo di lavorare con typeahead e Bloodhound. La documentazione non è molto utile. Ho un set di oggetti JSON che torno da un'API con cui lavoro. Sto cercando di capire come navigare attraverso i miei oggetti JSON in modo che Bloodhound possa capirli.
L'obiettivo qui è che un utente inizierà a digitare un nome di brano. Il completamento automatico mostrerà quindi un elenco di nomi di brani e l'artista con cui è stato eseguito.
Per esempio: Chimes At Midnight di Mastodon
Sto usando le ultime versioni di ogni libreria: https://twitter.github.io/typeahead.js/
Il campione JSON (SampleData.json):
{"response": {"status": {"version": "4.2", "code": 0, "message": "Success"}, "songs": [{"title": "Chimes At Midnight", "artist_name": "Mastodon", "artist_foreign_ids": [{"catalog": "7digital-AU", "foreign_id": "7digital-AU:artist:29785"}, {"catalog": "7digital-UK", "foreign_id": "7digital-UK:artist:29785"}], "tracks": [], "artist_id": "ARMQHX71187B9890D3", "id": "SOKSFNN1463B7E4B1E"}, {"title": "Down Under", "artist_name": "Men at Work", "artist_foreign_ids": [{"catalog": "7digital-AU", "foreign_id": "7digital-AU:artist:50611"}], "tracks": [], "artist_id": "AR4MVC71187B9AEAB3", "id": "SORNNEB133A920BF86"}]}}
Utilizzare questo sito http://json.parser.online.fr/ per formattare facilmente il JSON.
Il JSON che tornerò sarà sempre nello stesso formato, ma conterrà dati diversi. In questo esempio, le "tracce" sono nulle. Altri risultati avranno dati. Dovrei anche essere in grado di accedere a tali dati.
Sto usando l'ultima versione di JQuery. Ecco quello che ho incluso nel mio pagina html:
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script src="Scripts/typeahead.bundle.min.js"></script>
Ecco il codice HTML:
<div id="prefetch">
<input class="typeahead" type="text" placeholder="Songs...">
</div>
Ecco lo script:
// instantiate the bloodhound suggestion engine
var engine = new Bloodhound({
datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.tokens.join(' ')); },
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: "SampleData.json",
filter: function (response) {
return response.engine;
}
}
});
// initialize the bloodhound suggestion engine
engine.initialize();
// instantiate the typeahead UI
$('#prefetch .typeahead').typeahead(
{
hint: true,
highlight: true,
minLength: 1
},
{
name: 'songs',
displayKey: function (engine) {
return engine.songs.artist_name;
},
source: engine.ttAdapter()
});
Quando provo a eseguire questo codice ho ottiene il seguente errore:
Tipo non rilevato Errore: impossibile leggere i "token" di proprietà di un definito
Qualsiasi aiuto o direzione qui sarebbe molto apprezzato. Ho solo bisogno di sapere come ottenere i dati JSON con cui lavoro con Typeahead/Bloodhound.
Grazie!
Contento di poter aiutare Jared :) –