bootstrap typeahead返回名称和id
海兰! 我正在使用twitter bootstraps typeahead:
我正在调用一个页面,该页面返回带有json_encode的响应,页面返回一个名称和一个ID,
我希望typeahead列表会显示名称列表,当我选择其中一个名称来将id值写入隐藏字段时。
调用工作正常,写一个字段应该很容易。 我不知道该怎么做是如何将名称与id分开。
现在,当我搜索某些东西时,在suggesstion列表中我可以看到返回的结果如下:
name1:id1 name2:id2
我只想看到名字,但也要带上id的值。
我怎样才能做到这一点?
$(function(){ $("#typeahead_").typeahead( { source: function(query, process) { $.ajax({ url: '/getAjaxProducts', type: 'POST', data: 'query=' + query, dataType: 'JSON', async: true, success: function(data) { process(data); } }); } }); });
包含名称/ ID对的典型JSON文档将如下所示:
[ { "id": 1 "name": "firstName" }, { "id": 2 "name": "secondName" } ]
这里的策略是构建一个对象文字,在解析结果时将名称映射到ID,而只使用名称来填充类型:
var productNames = new Array(); var productIds = new Object(); $.getJSON( '/getAjaxProducts', null, function ( jsonData ) { $.each( jsonData, function ( index, product ) { productNames.push( product.name ); productIds[product.name] = product.id; } ); $( '#product' ).typeahead( { source:productNames } ); } );
用户从预先输入中选择一个项目后,您可以使用以下内容引用所选项目:
$( '#product' ).val()
并且您可以获得与所选项目相关联的ID:
productIds[$( '#product' ).val()]
从您的问题来看,您的JSON文档看起来可能有点不同,因此您可以根据需要更改解析,但适用相同的一般策略。
很抱歉“复活”这篇文章,但我会疯了!
如果你们中的一些人在使用这些示例代码时遇到问题(他们都没有工作,所有人都返回“Undefined”而不是显示名称
只需添加
displayKey: 'name',
用您的远程源返回的标签var名称替换课程“名称”
(很难找到最新的样本,网上发现的大部分样本都是针对以前版本的typeahead而不是与新版本兼容……)
......updater: function (item) { var item = JSON.parse(item); console.log(item.name); $('#VehicleAssignedTechId').val(item.id); return item.name; }
在类型调用的更新程序中,您可以按上面的代码放置,允许您在文本框中添加选择的值,或者您必须将其值放在其他隐藏字段中的位置。
完整的ajax调用如下:
$('#VehicleAssignedTechName').typeahead({ source: function(query, process) { var $url =SITE_URL+ 'api/vehicle_techfield_typeahead/' + query + '.json'; var $items = new Array; $items = [""]; $.ajax({ url: $url, dataType: "json", type: "POST", success: function(data) { console.log(data); $.map(data, function(data){ var group; group = { id: data.id, name: data.name, toString: function () { return JSON.stringify(this); //return this.app; }, toLowerCase: function () { return this.name.toLowerCase(); }, indexOf: function (string) { return String.prototype.indexOf.apply(this.name, arguments); }, replace: function (string) { var value = ''; value += this.name; if(typeof(this.level) != 'undefined') { value += ' '; value += this.level; value += ''; } return String.prototype.replace.apply('' + value + '', arguments); } }; $items.push(group); }); process($items); } }); }, property: 'name', items: 10, minLength: 2, updater: function (item) { var item = JSON.parse(item); console.log(item.name); $('#VehicleAssignedTechId').val(item.id); return item.name; } });
我注意到在使用此代码时,如果匹配包含字母’st’,则预先输入建议包括typeahead建议中的样式标记。
例如,建议的匹配将显示
style =“padding:10px; font-size:1.5em;”>标准
代替
标准
我将替换function更改为:
replace: function (string) { return String.prototype.replace.apply(this.name, arguments); }
显然你失去了额外的格式,但它没有在’st’匹配中断(我认为它也会在’di’或div标签的其他子串中断。
当我尝试处理用户名和id时,我遇到了同样的问题。我有一个棘手的修复但后来我用适当的解决方案修复了它。
看看这一个,
$('#search').typeahead({ source: function(query, process) { var $url = "/controller/function/list_users/?q="+query; var $datas = new Array; $datas = [""]; $.ajax({ url: $url, dataType: "json", type: "GET", success: function(data) { $.map(data, function(data){ var group; group = { id: data.id, name: data.user_name, toString: function () { return JSON.stringify(this); //return this.variable; }, toLowerCase: function () { return this.name.toLowerCase(); }, indexOf: function (string) { return String.prototype.indexOf.apply(this.name, arguments); }, replace: function (string) { var value = ''; value += this.name; if(typeof(this.name) != 'undefined') { value += ' '; //value += this.name; value += ''; } return String.prototype.replace.apply('' + value + '', arguments); } }; $datas.push(group); }); process($datas); } }); }, property: 'user_name', items: 10, minLength: 2, updater: function (item) { var item = JSON.parse(item); $('#hiddenId').val(item.id); $('#username').val(item.name); //you can perform your actions here //example //location = '/controller/function/'+item.id+'/edit'; //document.redirect = location; } });
看看这个链接也。
http://vaisakhvm.wordpress.com/2013/07/31/twitter-bootstrap-typeahead-process-multiple-values/
我的解决方案是:
var productNames = new Array(); var productIds = new Object(); $.getJSON( '/getAjaxProducts', null, function ( jsonData ) { $.each( jsonData, function ( index, product ) { productNames.push( product.id + product.name ); productIds[product.id + product.name] = product.id; } ); $( '#product' ).typeahead( { source:productNames } ); } );
在我的例子中,product.id是一个代码,因此在typeahead控件中显示它很有用。 通过这种方式,我避免了重复名称的风险。