所以我在聚合物中使用简单的自动完成方法
<paper-input autocomplete="on" name="stuff" list="stuffs"></paper-input>
有一个简单的项目列表
(尝试使用select和template元素来执行此操作)
<datalist id="stuffs"> <option value="blah blah"/> . . . </datalist>
解决方法
我认为你最好的选择就是不要使用datalist.
这是我为自己编写的组件示例:
<dom-module id="paper-autocomplete"> <style> iron-collapse { Box-shadow: 6px; } paper-button { width: 100%; text-transform: none; } </style> <template> <paper-input-container> <label>{{label}}</label> <content select=".content"></content> <input id="searchBox" class="paper-input-input" is="iron-input" bind-value="{{searchValue::input}}"></input> </paper-input-container> <iron-collapse id="collapse"> <paper-material> <div> <template id="resultList" is="dom-repeat" items="{{choices}}" filter="_listFilter"> <paper-item> <paper-button on-tap="_selectItem">{{item.name}}</paper-button> </paper-item> </template> </div> </paper-material> </iron-collapse> </template> </dom-module> <script> (function() { Polymer({ is: "paper-autocomplete",properties: { choices: Array,label: String,value: { type: Object,},searchValue: { type: String,value: '',observer: "_valueChanged" } },ready: function() { this.$.resultList.render() },_valueChanged: function(e) { var collapse = this.$.collapse if (e != '' && !collapse.opened) { this.$.resultList.render() collapse.toggle() } else if (e == '' && collapse.opened) { collapse.toggle() } },_listFilter: function(item) { return item.name.toLowerCase().includes( this.searchValue.toLowerCase() ) },_selectItem: function(event) { var collapse = this.$.collapse; this.set('searchValue',event.model.item.name) this.set('value',event.model.item) collapse.toggle() } }) })() </script>
_valueChanged观察输入中对searchValue的更改并切换折叠. _listFilter根据searchValue过滤绑定到dom-repeat的项目.
可以将#resultList或#collapse元素放在其他位置以用于您自己的目的.
编辑
我应该指出,这里的选择是一个对象数组,每个对象都有一个name属性,就是它们的过滤方式.它可以很容易地改变,以根据你想要实现的内容过滤字符串数组.