我想构建一个类似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,但如果必须,我该如何提供数据?
答案 0 :(得分:0)
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
}
}]
});