HY!我正在使用twitter bootstraps typeahead:
我正在调用一个返回json_encode响应的页面 页面返回一个名称和一个ID,
我希望输入型列表会显示名称列表, 当我选择其中一个名字 将id值写入隐藏字段。
调用工作正常,写一个字段应该很容易。 我不知道该怎么做是如何将名称与id分开。
现在,当我搜索某些东西时,在suggesstion列表中我可以看到返回的结果如下:
NAME1:ID1 NAME2:ID2
我只想看到名字,但也要带上id的值。
我该怎么做?
$(function(){
$("#typeahead_<? print $key; ?>").typeahead(
{
source: function(query, process)
{
$.ajax({
url: '/getAjaxProducts',
type: 'POST',
data: 'query=' + query,
dataType: 'JSON',
async: true,
success: function(data)
{
process(data);
}
});
}
});
});
答案 0 :(得分:21)
包含名称/ 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文档看起来可能有点不同,因此您可以根据需要更改解析,但适用相同的一般策略。
答案 1 :(得分:8)
抱歉&#34; resurect&#34;这篇文章,但我会疯了!
如果你们中的一些人在使用这些示例代码时遇到问题(他们都没有工作,所有人都回来了#34;未定义&#34;而不是显示名称
添加
displayKey: 'name',
更换课程&#39; name&#39;通过远程源返回的标签var名称
(很难找到最新的样本,网上发现的大多数样本都是先前版本的typeahead,而不是与新版本的兼容......)
答案 2 :(得分:7)
......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 += ' <span class="pull-right muted">';
value += this.level;
value += '</span>';
}
return String.prototype.replace.apply('<div style="padding: 10px; font-size: 1.5em;">' + value + '</div>', 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;
}
});
答案 3 :(得分:0)
我注意到在使用此代码时,如果匹配包含字母'st',则预先输入建议包括typeahead建议中的样式标记。
例如建议的匹配将显示
style =“padding:10px; font-size:1.5em;”&gt; standard
而不是
标准
我将替换功能更改为:
replace: function (string) {
return String.prototype.replace.apply(this.name, arguments);
}
显然你失去了额外的格式,但它并没有在'st'匹配中中断(我认为它也会在'di'或div标签的其他子串中断。
答案 4 :(得分:0)
当我尝试处理用户名和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 += ' <span class="pull-right muted">';
//value += this.name;
value += '</span>';
}
return String.prototype.replace.apply('<div style="padding: 10px; font-size: 1em;">' + value + '</div>', 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</p>
//location = '/controller/function/'+item.id+'/edit';
//document.redirect = location;
}
});
也看看这个链接。
http://vaisakhvm.wordpress.com/2013/07/31/twitter-bootstrap-typeahead-process-multiple-values/
答案 5 :(得分:0)
我的解决方案是:
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控件中显示它很有用。通过这种方式,我避免了重复名称风险。