1

たとえば、jsonファイルがあるとします

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

そして、「valueKey」プロパティが上記のjsonのネストされたオブジェクト「user」のプロパティ「name」を指すようにするtypeahead.jsオブジェクトを初期化しています。

$('#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

それができるかどうかはわかりませんが、aを使用しfilter:て JSON の結果を処理し、そこからデータムの新しい配列を作成できます。その中で、 user.name を各項目の直接キー ( key などuser_name) に「昇格」し、 に設定valueKeyuser_nameます。

于 2013-10-09T16:35:28.003 に答える
0

実際、typehead のソース コードを変更することで 1 つの方法を見つけました (最善の方法ではありません)。

関数 _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;
}

typehead.js のソース コードを変更せずに誰かが解決策を見つけてくれることを願っています。

于 2013-10-09T22:11:31.077 に答える