15

是否可以将用户的选择限制为 Bootstrap Typeahead 项的预定义数据源项?因此,如果用户键入的内容不在数据源中,则会显示一条消息通知他们?

这是演示:http ://cruiseoutlook.com/test

4

4 回答 4

18

如果我理解,当 typeahead 组件失去焦点时,如果它不在列表中,应该提醒用户它的输入无效?

因此,代码将是这样的:

var myData = [...]; // This array will contain all your possible data for the typeahead

$("#my-type-ahead").typeahead({source : myData})
                   .blur(validateSelection);

function validateSelection() {
    if(source.indexOf($(this).val()) === -1) 
        alert('Error : element not in list!');
}

请注意indexOf在 IE6-8 中未实现的事实。但是可以找到垫片,例如:Best way to find if an item is in a JavaScript array? .

于 2012-12-06T12:59:50.853 回答
6

我遇到了同样的问题,但在我的情况下,我的所有数据都是远程的。Bloodhound 并没有我目前知道的任何好的钩子可以让你做到这一点,但你可以钩入 ajax 完整回调并手动建立一个有效的输入缓存,然后在更改/模糊时检查它。

var myData = new Bloodhound({
    remote: {
        url: '/my/path/%QUERY.json',
        ajax: {
            complete: function(response){
                response.responseJSON.forEach(function (item) {
                    if (myData.valueCache.indexOf(item.value) === -1) {
                        myData.valueCache.push(item.value);
                    }
                });
            }
        }
    }
});
myData.valueCache = [];
myData.initialize();

$('#artists .typeahead').typeahead(null, {
    source: myData.ttAdapter()
}).bind('change blur', function () {
    if (myData.valueCache.indexOf($(this).val()) === -1) {
        $(this).val('');
    }
});
于 2015-01-20T11:38:07.403 回答
4

Using jquery and Samuel's solution I think you will overcome the IE problem. Change your validateSelecion function to:

function validateSelection() {
    if ($.inArray($(this).val(), myData) === -1) 
        alert('Error : element not in list!');
}

Leave the rest as Samuel pointed out.

于 2013-04-24T15:39:47.707 回答
1

我以稍微不同的方式解决了这个问题——大多数情况下,您需要捕获建议选项的 id,然后发布到后续的 Web 服务调用等。

我决定在 typeahead 异步调用开始时清空一个隐藏字段,并将隐藏字段的值设置为 datum.id 在自动完成或选定的 typehead 事件上。

提交表单时,我只是检查隐藏字段是否有值,如果没有,则用户从未选择过建议的选项。

我通过根据 typeahead 字段的名称为其添加 _id 来命名隐藏字段,然后在 onAutocompleted 和 onSelected 函数中使用此代码

我通过添加来指定这些功能:

.on('typeahead:selected', onAutocompleted)
.on('typeahead:autocompleted', onSelected)

在将 .typeahead 功能添加到输入字段的代码中。

var n = $(this).attr('name')+'_id';
$('input[name="' + n + '"]').val(datum.id);

typeahead 文档谈到有三个参数传递给自动完成和选择的函数,事件、数据和名称,但我从未见过传递的名称,这就是我使用 $(this).attr 的原因('name') 机制来获取字段的名称。

于 2016-06-26T12:50:57.847 回答