如何为typeahead.js设置一个指向嵌套对象属性的valueKey?

时间:2013-10-09 14:10:51

标签: typeahead.js

说,我有一个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方法的情况下执行此操作,那么任何想法(实际上覆盖也会很好)?

提前多多感谢。

2 个答案:

答案 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源代码的情况下找到解决方案。