我有一个将“用户”与“事物”相关联的“添加新事物”表单。
我正在使用 Twitter Bootstrap Typeahead 在我键入时提供用户列表。
它工作得很好,如果用户在列表中,我可以选择它。
但如果用户不存在,我想显示一个“创建新用户”链接。
所以基本上,我需要在.typeahead()
. 我搞不定。
我有一个将“用户”与“事物”相关联的“添加新事物”表单。
我正在使用 Twitter Bootstrap Typeahead 在我键入时提供用户列表。
它工作得很好,如果用户在列表中,我可以选择它。
但如果用户不存在,我想显示一个“创建新用户”链接。
所以基本上,我需要在.typeahead()
. 我搞不定。
扩展 typeahead 类:
var newusertext = 'New user';
var newuserlink = '/add/user/0';
$.fn.typeahead.Constructor.prototype.process = function (items) {
var that = this
items = $.grep(items, function (item) {
return that.matcher(item)
})
items = this.sorter(items)
if (!items.length) {
return this.rendernonmatch().show()
}
return this.render(items.slice(0, this.options.items)).show()
}
$.fn.typeahead.Constructor.prototype.rendernonmatch = function () {
var that = this
var items = new Array();
items.push(newusertext)
items = $(items).map(function (i, item) {
i = $(that.options.item).attr('data-value', item)
i.find('a').html(that.highlighter(item))
return i[0]
})
items.first().addClass('active')
this.$menu.html(items)
return this
}
/* redirect to the registration page to add a new user */
$.fn.typeahead.Constructor.prototype.updater = function (item) {
if(item === newusertext){ window.location = newuserlink; return}
return item
}
我使用了 typeahead notFound 'template' 选项,从那里我可以设置一个对我来说更易于访问的链接按钮。预输入设置:
$('#remote .typeahead').typeahead({
hint: true,
highlight: true,
minLength: 2
},
{
name: 'sn-tags',
display: 'tag',
source: oBusqTags, //Bloodhound object
templates: {
notFound: '<p>No matches<br><a id="btnAddNewTag" href="#">Add New Tag</a></p>'
}
}).bind("typeahead:select", function(obj, datum, name) {
//add selection as an option on a select element
$('#lbxAddTag').append($('<option>', {
value: datum.id,
text: datum.tag
}));
});
这是该链接的侦听器:
$('#remote').on('click', '#btnAddNewTag', function(e){
$('#lbxAddTag').append($('<option>', {
value: "0",
// this is tricky, as there aren't any matches then
// $('#remote .typeahead').typeahead('val') contains '',
// so i had to set an id for the typeahead input text box and
// 'manually' get its value
text: $('#tbxBusqTag').val()
}));
// as the text is already added as a select option
// i clean the typeahead input box
$('#remote .typeahead').typeahead('val','');
e.preventDefault();
});