Порывшись в гуголе нашёл только предложения хранить массив строк с 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":"Ваш персонаж становился народным артистом СССР либо России?"}]