【问题标题】:Jquery AutoComplete multidimensional data sourceJquery AutoComplete 多维数据源
【发布时间】:2013-06-25 06:46:48
【问题描述】:

这是我的 JSON 格式的数据源:

{
"list-1":
    [{"id":"1","value":"andy"},{"id":"2","value":"sandy"}],
"list-2":
    [{"id":"1","value":"candy"},{"id":"2","value":"brandy"}],
"list-3":
    [{"id":"1","value":"mandy"},{"id":"2","value":"dandy"}]
}

我正在尝试获得以下输出:

<div id="result">
    <ul class="list-1">
        <li>andy</li>
        <li>sandy</li>
    </ul>
    <ul class="list-2">
        <li>candy</li>
        <li>brandy</li>
    </ul>
    <ul class="list-3">
        <li>mandy</li>
        <li>dandy</li>
    </ul>
</div>

默认的数据源(JSON格式)如下:[{"id":"1"},{"foo":"bar"}],我一直没找到好的/易于遵循有关如何检索多维数据数组的文档/教程。

谁能帮我解释一下,我需要在 JQuery AutoComplete 插件中修改/覆盖什么以实现此输出(在 Select 或 Success 事件中?或者我应该修改渲染部分以及如何修改)

提前致谢

【问题讨论】:

  • 这是一个带有自定义输出和默认单维数据的示例运行代码codepen.io/anon/pen/FqEJt(感谢stackoverflow.com/a/2746987/2518765
  • 我找到了一种解决方法,编辑数据源使其成为一维数据源并将type 添加到每个项目,然后在 renderItem 函数中检查类型,如果类型是list=1我使用 ID list-1 将该项目附加到我的自定义 UL。虽然这可行,但这并不完全是我所追求的,如果有人想出更好的主意,我会把问题留在这里。代码在下一条评论中。
  • jQuery("#toplivesearch").data("autocomplete")._renderItem = function( ul, item ) { var container; if(item.type == "list-1"){ container = $("#list-1"); } if(item.type == "list-2") { container = $("#list2"); } if(item.type == "list-3") { container = $("#list-3"); } return $("&lt;li&gt;&lt;/li&gt;").data("item.autocomplete", item).append("&lt;a&gt;" + item.label + "&lt;/a&gt;").appendTo(container); }; 你必须在 html 中创建自己的 UL &lt;ul id="list-1"&gt;&lt;/ul&gt;&lt;ul id="list-2"&gt;&lt;/ul&gt; 等等最后你会得到一个额外的空 UL,你可以隐藏它。

标签: jquery json autocomplete


【解决方案1】:

我不太确定,您指的是哪个自动完成功能,但我猜您的意思是这个:http://jqueryui.com/autocomplete 对吧?

我发现,大多数自动完成解决方案都不是很灵活。而且似乎只有少数几个(尽管我认为前一段时间有很多)。但是xing 使用了一个 autoCompletion 插件,可以在他们的 github 页面上找到,它应该足够灵活,可能适合您的特殊标记。它被设计为灵活的。看看on github/xing/jquery.autocompletr

自述文件只提到了该工具的sourceinputProcessoroutputProcessors 参数,但还有一个itemRenderercontainerRendererbeforeShow 可以使用钩子。您很可能需要 itemRenderercontainerRenderer 来完成您的特殊标记。

希望这会有所帮助。但是您的 JSON 响应对于在自动完成器中的使用来说真的很奇怪,因此您也可能必须更改您的 JSON 响应以仅生成一个包含数据的数组,或者为您的用例编写自己的响应。

干杯

【讨论】:

  • 是的,jqueryui.com/autocomplete 是我正在尝试使用的,问题是在让 AutoComplete 做我想做的事情时接受失败。我的 JSON 响应是由 PHP 生成的(我正在使用 YiiFramework)我可以毫无问题地操作它,当前的格式对我来说似乎很简单。谢谢
【解决方案2】:

您可以使用 jquery tmplt 作为模板工具 https://github.com/BorisMoore/jquery-tmpl) 来实现您想要实现的目标。由于您的数据是 JSON 对象,您可以创建一个模板:

html:

<div id="result">

</div>


//On document ready:
$(document).ready(function(){
//set your json object (this could be from a ajax call or whatever)    
var objectData = 
    {
    "list-1":
        [{"id":"1","value":"andy"},{"id":"2","value":"sandy"}],
    "list-2":
        [{"id":"1","value":"candy"},{"id":"2","value":"brandy"}],
    "list-3":
        [{"id":"1","value":"mandy"},{"id":"2","value":"dandy"}]
    }

    //init variables
    var key, count = 0;
    //loop through the object:
    for(key in objectData) {
       //create a UL element for each main item:
       $('#result').append('<ul class="' + key + '"></ul>');

        //loop through each child object:
        if(objectData.hasOwnProperty(key)) {
            for (var i = 0; i < objectData[key].length ; i++)
             //add the template:  
             $.tmpl( '<li>${value}</li>', { "value" : objectData[key][i].value }).appendTo("." + key);  
        }
}

});

为此,请务必包含 tmpl.js CDN:http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.js

在这里提琴:http://jsfiddle.net/eRQ4V/

【讨论】:

  • 谢谢,我已经尝试过您的代码,但是由于我试图在现有的 AutoComplete 结构中实现它,所以它不起作用,或者我应该说我还不能实现它.据我所知,为了实现我想要做的事情,我必须覆盖 Response 事件以及 AutoComplete 的 __renderItem 函数。我将尝试提供整个事情的示例代码以更好地解释问题
  • 您可能仍然使用该逻辑来遍历您的 JSON 对象,然后应用自动完成逻辑而不是我使用的模板插件。
  • 这正是我试图做的,但是在函数之间传输的数据会以某种方式被操纵,考虑到问题中的示例数据源,renderMenu 函数仅将第一个数据数组传递给 renderItem 函数 3 次,需要弄清楚在这里做什么(请参阅我对示例运行代码问题的评论)
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多