Bootstrap-UI Typeahead отображает более одного свойства в списке результатов?

Я использую тип ui-bootstrap. Это работает блестяще! Однако мне интересно, возможно ли отображать несколько свойств или даже HTML в списке результатов. Типичная проблема: поиск возвращает более одного объекта с одинаковым значением. Например, поиск по запросу «удивительная грация» возвращает [«удивительная грация», «удивительная грация»], где один — фильм, а другой — песня. Я хотел бы, чтобы список результатов был больше похож на:

amazing grace | movie
amazing grace | song

... чтобы пользователь точно знал, что он выбирает. Еще лучше была бы иконка рядом с заголовком. Другими словами, каждый результат в списке содержит некоторый HTML. Можно ли сделать что-то из этого из коробки?


person MFB    schedule 15.08.2013    source источник
comment
stackoverflow.com/a/18028408/304319 и взгляните на эту демонстрацию jsfiddle.net/ZKqQM/9   -  person zs2020    schedule 15.08.2013
comment
@sza спасибо за совет. Я бы никогда не нашел этот вопрос, учитывая его название и то, что я уже знаю об итерации объекта внутри typeahead, но не о том, как его отобразить. Ваше здоровье   -  person MFB    schedule 16.08.2013


Ответы (1)


Что нужно знать о директиве typeahead из http://angular-ui.github.io/bootstrap/, так это то, что пытается имитировать синтаксис, используемый директивой select из AngularJS. Это означает, что все выражения, используемые для выбора модели для привязки и метки, являются выражениями AngularJS. Это, в свою очередь, означает, что вы можете использовать любое выражение AngularJS для вычисления текста вашей метки.

Например, чтобы отобразить желаемый текст, вы можете написать:

typeahead="item as item.title + ' (' + item.type + ')' for item in titles | filter:{title:$viewValue}"

При условии, что ваша модель данных выглядит следующим образом:

$scope.titles = [
    {title: 'Amazing Grace', type: 'movie'},
    {title: 'Amazing Grace', type: 'song'}
  ];

Рабочий образец здесь: http://plnkr.co/edit/VemNkVnVtnaRYaRVk5rX?p=preview

Написание сложных выражений для метки в атрибуте typeahead может показаться некрасивым, но ничто не мешает вам перенести логику расчета метки в функцию, доступную в области видимости, например:

typeahead="item as label(item) for item in titles | filter:{title:$viewValue}"

где label — это функция, представленная в области видимости:

$scope.label = function(item) {
    return item.title + ' (' + item.type + ')';
  };

Еще один пример: http://plnkr.co/edit/ftKZ96UrVfyIg6Enp7Cy?p=preview.

Что касается вашего вопроса о значках, вы можете встроить HTML в выражения меток, но это ужасно писать и поддерживать. К счастью, директива typeahead позволяет вам предоставить собственный шаблон для совпадающего элемента, например:

typeahead-template-url="itemTpl.html"

В пользовательском шаблоне вы можете использовать любые выражения или директивы AngularJS. Добавление значков становится тривиальным с небольшой помощью директивы ngClass:

<script type="text/ng-template" id="itemTpl.html">
   <a tabindex="-1">
      <i ng-class="'icon-'+match.model.type"></i>
      <span  ng-bind-html-unsafe="match.model.title | typeaheadHighlight:query"></span>
   </a>
</script>

И рабочий пример: http://plnkr.co/edit/me20JzvukYbK0WGy6fn4?p=preview

Довольно изящная маленькая директива, не так ли?

person pkozlowski.opensource    schedule 15.08.2013
comment
Очень аккуратный! Вы же написали не так ли?? ;) Однако по какой-то причине мне было трудно найти для него хорошую документацию. Было бы неплохо, если бы была ссылка на документы со всеми параметрами и т. д. с этой страницы angular-ui.github.io/bootstrap/#/typeahead - person MFB; 16.08.2013
comment
Как бы вы вызвали функцию контроллера из ссылки, встроенной в шаблон? Функция никогда не вызывается, поэтому кажется, что мы находимся в другой области видимости? Для подробного объяснения см.: stackoverflow.com/questions/18441928/ - person recalcitrant; 27.08.2013
comment
БОЛЬШОЕ СПАСИБО за образец и Plunkr. Я боролся с typeahead в ng-grid уже 2 дня, и ваш пример помог мне разобраться. - person jklemmack; 15.10.2013
comment
Если у вас возникли проблемы (например, пустое всплывающее окно), попробуйте использовать bind-html-unsafe вместо ng-bind-html-unsafe. (Это сработало для меня — я использую UI.bootstrap.typehead для boostrap3 (boostrap3 ветвь) - person vucalur; 24.11.2013
comment
Шаблон отличный, но как сделать так, чтобы он получал доступ к параметрам области видимости? Подробности см. в моем вопросе на http://stackoverflow.com/questions/24833151/how-to-make-bootstrap-typeahead-template-to-use-scope-parameter-in-angular. - person newman; 19.07.2014
comment
второй plunkr совпадает с первый plunkr, который вы предоставили. - person John; 20.01.2016
comment
Всегда ли это match.model.foo? Я пытаюсь использовать match.model | json, чтобы проверить, что там есть, и получить нераспознанную ошибку выражения. Как я могу отлаживать? - person Kev; 05.02.2016
comment
Я попробовал ваш plunkr. Он очень хорошо работает с angular 1.05, но не с angular 1.2.2. Почему??? - person Vishal; 05.08.2016