javascript - 使用 Bootstrap tagsinput 以编程方式选择 Bloodhound 自动完成标签列表

标签 javascript typeahead.js bloodhound bootstrap-tags-input

我有一个由 Bootstrap Tagsinput 提供支持的文本输入。目前,这个文本输入是用 Typeahead 自动完成中使用的单个标签列表初始化的:

$('.tagsInput').tagsinput({
    maxChars: 25,
    maxTags: 5,
    typeaheadjs: [{
          minLength: 1,
          highlight: true
    },{
        minlength: 1,
        source: new Bloodhound({
          datumTokenizer: Bloodhound.tokenizers.whitespace,
          queryTokenizer: Bloodhound.tokenizers.whitespace,
          local: allTags
        })
    }],
    freeInput: true
});

allTags 是一个 Json 字符串数组。

然而,我想要实现的是,我没有一个简单的标签列表,即 allTags,而是有某种可以访问不同列表的函数,然后可以选择正确的取决于某些元素的值。例如,将有一个下拉列表,根据所选的值,将使用不同的标签列表。 我做不到。

不过,我找到了一个变通方法,基本上,我使用我的文本输入元素的类名,并且我在与列表一样多的类名上初始化尽可能多的 tagsInput。这行得通,但它似乎过于复杂,并不是真正干净的实现。

有什么想法吗?

更新: 这是 HTML:

<input id="tags" name="tags" data-role="tagsinput" class="form-control input-sm tagsInput typeahead" type="text" placeholder="Enter some tags" title="Please enter some tags" value="" required>

select 是一个普通的select

最佳答案

select 更改时,您调用一个函数来告诉 Bloodhound 使用哪个数组(或 json 文件/url),然后要求它重新运行其 initialize函数更新预输入建议列表。

HTML:

<h1>Typeahead Test </h1>
<select onchange="changeList(this.value)">
  <option selected value="countries">Countries</option>
  <option value="cities">Cities</option>
</select>

<input id="tags" name="tags" data-role="tagsinput" class="form-control input-sm tagsInput typeahead" type="text" placeholder="Enter some tags" title="Please enter some tags" value="" required>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"></script>
<script src="bootstrap-tagsinput.min.js"></script>

Javascript:

var country_list = ["Afghanistan", "Albania", "Algeria", "Andorra", "Auckland", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia & Herzegovina", "Botswana", "Brazil"];
var city_list = ["Amsterdam", "London", "Paris", "Washington", "New York", "Los Angeles", "Sydney", "Melbourne", "Canberra", "Beijing", "New Delhi", "Kathmandu", "Cairo", "Cape Town", "Kinshasa"];

var myData = new Bloodhound({
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  local: $.map(country_list, function(item) {
    return {
      value: item
    };
  })
});
myData.initialize();

$('#tags').tagsinput({
  typeaheadjs: {
    name: 'value',
    displayKey: 'value',
    valueKey: 'value',
    source: myData.ttAdapter()
  }
});

// utilised some code from http://stackoverflow.com/a/23000444/1544886
changeList = function(val) {
  source = (val === 'cities') ? city_list : country_list;
  myData.clear(); // First remove all suggestions from the search index
  myData.local = $.map(source, function(item) {
    return {
      value: item
    };
  });
  myData.initialize(true); // Finally reinitialise the bloodhound suggestion engine
};

这是一个傻瓜:http://plnkr.co/edit/6mjDrgDwqzWeLJQOcA3D?p=preview

关于javascript - 使用 Bootstrap tagsinput 以编程方式选择 Bloodhound 自动完成标签列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473447/

相关文章:

jquery - typeahead.js 根本没有响应 - Rails

twitter-bootstrap - 如何忽略部分模板以在 Typeahead.js 中突出显示?

javascript - 如何在 Typeahead 中获取多个输入?

javascript - 如何判断点击了哪个按钮

javascript - Bootstrap 下拉菜单不显示所选值

javascript - 使用拼接清空 Chromium 数组

javascript - 重定向 302 丢失 POST 数据

typeahead.js 获取选定的数据

javascript - Typeahead.js 建议未被过滤

jquery - 选择 jquery typeahead.js 后清除文本框