gpt4 book ai didi

javascript - Twitter typeahead 将自定义数据添加到数据集

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:48 25 4
gpt4 key购买 nike

我正在使用 twitter typeahead 来显示对我来说效果很好的类别建议。 问题在于子类别的显示。如果 类别有子类别 然后展开/折叠图标与建议一起显示,如果用户选择其中一个,子类别必须显示在它下面,我在显示部分成功但无法更新typeahead 的数据集,这样当用户选择一个子类别时,它应该显示在输入中。 请在 Jsfiddle 上使用键盘,因为我只尝试过按键。下面是我的json数组

JSFIDDLE here

[{
"id": "38",
"value": "Entertaintment",
"parent_id": "27",
"children": "1",
"childCategories": [{
"id": "28",
"value": "Movies",
"parent_id": "38"
}, {
"id": "29",
"value": "Sports",
"parent_id": "38"
}]
}, {
"id": "40",
"value": "eeen",
"parent_id": "27",
"children": "1",
"childCategories": [{
"id": "41",
"value": "een child 1",
"parent_id": "40"
}]
}, {
"id": "41",
"value": "een child 1",
"parent_id": "40",
"children": "0",
"childCategories": false
}]

我尝试了以下方法:

_onEnterKeyed: function onEnterKeyed(type, $e) {
var cursorDatum, topSuggestionDatum;
cursorDatum = this.dropdown.getDatumForCursor();
topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();
//My custom condition, if category has children show sub-categories below
if (cursorDatum.raw && cursorDatum.raw.children == "1") {
//below line is my failed try
//this.dropdown.updateChild('',cursorDatum.raw.childCategories,false);
var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave;
var childHTML='';
$('.ttchild').remove();
//adding the sub-categories to dropdown
$.each(cursorDatum.raw.childCategories,function(i,v){
childHTML += '<div class="tt-suggestion ttchild"><div class="suggestions"><span>'+this.value+'</span></div></div>';
});
$(childHTML).insertAfter('.tt-cursor');
return;
}

if (cursorDatum) {
this._select(cursorDatum);
$e.preventDefault();
}
else if (this.autoselect && topSuggestionDatum) {
this._select(topSuggestionDatum);
$e.preventDefault();
}
},

//This is my custom function trying to update the dataset, but i know its totally wrong.
updateChild: function updateChild(query,childs) {
var that = this;
this.query = query;
this.canceled = false;
this.source(query, render);

function render(childs) {
if (!that.canceled && query === that.query) {
that._render(query, childs);
}
}
},

JSFIDDLE here

例如:娱乐类别有子类别电影和体育。

希望有人能帮助我......

最佳答案

编辑 v.2

refactored再次,现在它完美运行。

我删除了之前的编辑并重构了 onEnterKeyed 函数如下

var dataSet = this.dropdown.datasets[0];

// childHTML is replaced by childDom
// var childHTML='';
var childDom = $('<div></div>');
$('.ttchild').remove();
$.each(cursorDatum.raw.childCategories,function(i,v){

var div = $('<div class="tt-suggestion ttchild"></div>');
div.append('<div class="suggestions"><span>'+this.value+'</span></div>');


var suggestion = v;

// TODO console log this is duplicated from dataset
var datasetKey = "ttDataset", valueKey = "ttValue", datumKey = "ttDatum";


// this is what makes it show in the input box
// set these data for the child element.
div.data(datasetKey, dataSet.name);
div.data(valueKey, dataSet.displayFn(suggestion));
div.data(datumKey, suggestion);

childDom.append(div);
});

// childHtml is replaced by childDom
$('.tt-cursor').append(childDom.children());

弃用编辑 v.1

refactored我的解决方案,现在它按预期工作了。

我删除了之前的编辑并在 getSuggestionNode 方法中添加了这一行。

for (var key in suggestion.childCategories) {
var value = suggestion.childCategories[key];
$el.append(getSuggestionNode(value));
}

已弃用

solved你的问题,虽然它需要你改进。

// I added this line
// add the child nodes to the suggestions.
suggestions = suggestions.reduce(function(res, num) { res.push(num); for (var i=0;i<num.children;i++) res.push(num.childCategories[i]); return res; }, [])

// nodes are calculated based on suggestions
// but child nodes are not added to suggestions so their data is not set (see below line)
nodes = _.map(suggestions, getSuggestionNode);

// inside the suggestions.map function
// here .data sets the necessary values required to render the input on cursor change.
// since child nodes are not mapped they are ignored.
$el = $(html.suggestion).append(that.templates.suggestion(suggestion))
.data(datasetKey, that.name)
.data(valueKey, that.displayFn(suggestion))
.data(datumKey, suggestion);

所以你不需要自定义的 updateChild 函数,虽然我不知道你是如何实现下拉列表的,这个解决方案会将子项添加到下拉列表中并立即显示它们,而无需按下进入父节点。您应该自行配置。

关于javascript - Twitter typeahead 将自定义数据添加到数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com