我正在使用ui.bootstrap typeahead
编写一个预先输入的搜索栏,并发现该组件非常直接使用。
我的控制器将数据提供给$scope
,如下所示:
var good = [{ name: 'Mario', role: 'sup' },
{ name: 'Luigi', role: 'bro' },
{ name: 'Yoshi', role: 'pet' }]
var bad = [{ badname: 'Bowser', role: 'boss' },
{ badname: 'Sauron', role: 'eye' },
{ badname: 'Jason', role: 'knifer' }]
$scope.data = good.concat(bad)
然后,在查看中,我有类似的内容:
<div class="container-fluid">
<pre>Model: {{selected| json}}</pre>
<input type="text" ng-model="selected" typeahead="datum.name for datum in data | filter:$viewValue | limitTo:4">
</div>
这最终会找到好人,但不是坏人(因为他们有badname
而不是name
有没有办法搜索两者?
<小时/> 奖金:我很乐意将
role
我的家伙展示在他们的名字之下......提示?
保持控制台打开,您将看到有关我正在谈论的标签的问题
只有善良的人出现,结束即使在搜索坏人中不存在的字段时,搜索也会抛出异常
答案 0 :(得分:4)
我编辑了你的plunkr来回答你的奖金问题:
http://plnkr.co/edit/Yo4xBT?p=preview
基本上,您可以使用自定义模板通过匹配执行任何操作。
对于主要问题,我的纯粹性质是建议您修改数组以保持一致,因此您必须始终在名称中搜索。只是因为你可以用角度做很多事情并不意味着你应该这样做,所以我从纯粹的软件工程角度讲。
编辑:我喜欢你的json数据。
答案 1 :(得分:4)
感谢 @baba 我设法解决了主要的奖金问题。
为了使用不同的属性名称正确标记数据,您可以在HTML
中指定多个标签<div class="container-fluid" ng-controller="TypeaheadCtrl">
<pre>Model: {{selected| json}}</pre>
<input type="text" ng-model="selected"
typeahead="datum as (datum.name+datum.badname) for datum in data | filter:$viewValue | limitTo:8"
typeahead-template-url='tpl.html'>
</div>
这将根据数据显示一个或另一个
问题是,如果两者都存在,它们将显示两者 ......
也就是说,可能最好的选择是为typeahead创建一个格式良好的数组,而不会弄乱代码,就像 @baba sugggested
使用匹配模板,问题很容易解决(例如)像这样的问题 的 tpl.html 强>
<a>
{{match.label}}<br>
{{match.model.role}}
</a>
就是这样。
再次成为男人们
答案 2 :(得分:1)
以与我相同的怀疑向他人澄清。 如果您想知道为什么突出显示消失了,您只需要在模板中应用以下过滤器。
<span bind-html-unsafe="match.label | typeaheadHighlight:query"></span>