Порывшись в гуголе нашёл только предложения хранить массив строк с JSON объектами и при необходимости парсить их. Ещё нашёл решение (Twitter Boostrap Typeahead Tutorial) хранить в typeahead массив идентификаторов объектов и при необходимости обращаться за объектом к глобальной коллекции. Отличное решение, если коллекция одна и статическая, с ajax такое не сработает. Отталкиваясь от него сделал своё решение. В нём в экземпляре typeahead создаётся поле с коллекцией объектов. Вот оно:
HTML:
<input autocomplete="off" class="selector" data-id-input="#QuestionID" data-link="@Url.Action(MVC.Play.QuestionTypeahead())" name="Question_Selector" type="text" /> <input id="QuestionID" name="QuestionID" type="hidden" />JS:
$('.selector').typeahead({
source: function (query, process) {
var idInput = this.$element.data().idInput;
var that = this;
return $.post(this.$element.data().sourceUrl, { query: query }, function (data) {
var selectorData = {};
for (i in data) {
var item = data[i];
selectorData[item.id] = item;
}
that.selectorData = selectorData;
return process($.map(data, function (item) { return item.id }));
});
},
matcher: function (id) {
return true;
},
highlighter: function (id) {
return this.selectorData[id].title;
},
updater: function (id) {
var idInput = this.$element.data().idInput;
if (idInput != null)
$(idInput).val(id);
return this.selectorData[id].title;
},
sorter: function (items) {
return items;
}
});
JSON от сервиса:[{"id":26,"title":"Был ли ваш персонаж главой СССР?"},{"id":364,"title":"Ваш персонаж становился народным артистом СССР либо России?"}]