1

说,我有一个json文件

[{"id":1,"color":"green","user":{"id":3,"email":"example@gmail.com","name":"Bob Dylan"}}]

我正在初始化 typeahead.js 对象,我希望“valueKey”属性指向上述 json 的嵌套对象“用户”的属性“名称”。

$('#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 方法的情况下做到这一点(实际上覆盖也可以)?

提前非常感谢。

4

2 回答 2

3

不确定你能做到这一点,但你可以使用 afilter:来处理 JSON 结果并从中构造一个新的数据数组。在其中,“提升” user.name 成为每个项目的直接键(例如 key user_name),并设置valueKeyuser_name.

于 2013-10-09T16:35:28.003 回答
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;
}

解析字符串以获取嵌套属性(感谢如何访问嵌套的 JSON 数据)并将 _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 源代码的情况下找到解决方案。

于 2013-10-09T22:11:31.077 回答