说,我有一个json文件
[{"id":1,"color":"green","user":{"id":3,"email":"example@gmail.com","name":"Bob Dylan"}}]
我正在初始化typeahead.js对象,我希望“valueKey”属性指向上面json的嵌套对象“user”的属性“name”。
$('#dom-object-id').typeahead([
{
name: 'someName',
prefetch: {
url: '../assets/template/data/fromAbove.json',
ttl: 1
},
valueKey: "user.name", // this obviously doesn't work
template: [
'<p>{{user.name}}</p>',
].join(''),
engine: Hogan
}
]);
如果可以在不更改源代码/覆盖内部typeahead.js方法的情况下执行此操作,那么任何想法(实际上覆盖也会很好)?
提前多多感谢。
答案 0 :(得分:3)
不确定是否可以这样做,但可以使用filter:
来处理JSON结果并从中构建新的基准数组。在其中,“提升”user.name为每个项目的直接键(比如键user_name
),并将valueKey
设置为user_name
。
答案 1 :(得分:0)
实际上我通过改变typeahead的源代码找到了一种方法(虽然不是最好的源代码)。
我在函数_transformDatum:
之后添加了一个函数_getProperty: function(json, path) {
var tokens = path.split(".");
var obj = json;
for (var i = 0; i < tokens.length; i++) {
obj = obj[tokens[i]];
}
return obj;
}
解析字符串以获取嵌套属性(感谢How to access nested JSON data)并将_transformDatum函数更改为:
_transformDatum: function(datum) {
var value = utils.isString(datum) ? datum : this._getProperty(datum, this.valueKey), tokens = datum.tokens || utils.tokenizeText(value), item = {
value: value,
tokens: tokens
};
if (utils.isString(datum)) {
item.datum = {};
item.datum[this.valueKey] = datum;
} else {
item.datum = datum;
}
item.tokens = utils.filter(item.tokens, function(token) {
return !utils.isBlankString(token);
});
item.tokens = utils.map(item.tokens, function(token) {
return token.toLowerCase();
});
return item;
}
我仍然希望有人可以在不更改typeahead.js源代码的情况下找到解决方案。