使用Meteor集合为Typeahead Bloodhound,最好不要使用我自己的API

时间:2014-11-05 15:06:32

标签: meteor twitter-typeahead bloodhound bootstrap-tokenfield

我想构建一个类似StackOverflow中的标签输入。我正在尝试将Meteor集合用作Typeahead Bloodhound的远程或预取数据,因为我想最终使用Bootstrap Tokenfield

根据他们的文档和示例,绝对需要JSON数据的URL。我如何向Bloodhound提供数据,最好是反应性的数据?我查看了Meteor Typeahead package,但我无法弄清楚如何将其与Meteor Tokenfield package一起使用。

以下是我尝试过的,但它不起作用。 :(

<div class="control-group">
    <label class="control-label" for="users">Users</label>
    <div class="controls">
      <input type="text" class="form-control" id="tokenfield-typeahead-users" value="" />
    </div>
</div> 

Template.viewUsers.rendered = function() {
    var users = new Bloodhound({
      datumTokenizer: function(d) {
        return Bloodhound.tokenizers.whitespace(d.username);
      },
      queryTokenizer: Bloodhound.tokenizers.whitespace,
      limit: 20,
      remote: {
        // url points to a json file that contains an array of tokens
        url: function() { 
          return Meteor.users.find().fetch().map(function(user){ return user.username; }); 
        }
      }
    });

    users.initialize();// kicks off the loading/processing of `local` and `prefetch`

    // passing in `null` for the `options` arguments will result in the default
    // options being used
    $('#tokenfield-typeahead-users').tokenfield({
      typeahead: [null, { 
        name: 'users',
        displayKey: 'username',
        source: users.ttAdapter() 
        // `ttAdapter` wraps the suggestion engine in an adapter that
        // is compatible with the typeahead jQuery plugin
      }]
    });
};

我不想构建API,但如果必须,我该如何提供数据?

2 个答案:

答案 0 :(得分:0)

This code posting使用:

    local: [{ val: 'dog' }, { val: 'pig' }, { val: 'moose' }],

答案 1 :(得分:0)

花了很多时间试图让tokenfield与我的Meteor系列反应性地工作,所以我也会在这里发布我的解决方案。

我最终根本没有使用Bloodhound,而只是直接使用Meteor。 我意识到RegEx搜索非常原始,但如果您搜索的是一组标签,它就能完成这项工作。

var currentTags = []; // Handle this however you wish

$('#tokenfield').tokenfield({
    typeahead: [null, {
        name: 'tags',
        displayKey: 'value',
        source: function(query, syncResults, asyncResults) {

            var suggestedTags = Tags.find({value: {
                $regex: "^"+query,
                $options: "i",
                $nin: currentTags
            }}).fetch();

            syncResults(suggestedTags);
            //Optionally do some server side lookup using asyncResults
        }
    }]
});