使用jQuery TokenInput插件在Rails中动态自动完成

时间:2011-05-06 10:33:45

标签: jquery ruby-on-rails autocomplete jquery-tokeninput

我正在使用伟大的TokenInput插件(http://loopj.com/jquery-tokeninput/)来为rails做一些自动完成,而对于模型中的一组正常数据,它可以很好地工作。但我的问题是,在我的情况下,我实际上有2个文本框我想使用它,第二个的建议应该取决于第一个的内容。 更具体地说:我需要选择一个足球俱乐部(我可以从我的数据库中的所有现有俱乐部中自动完成),然后选择参加比赛的球队。所以团队的自动完成应该只使用与已经选择的俱乐部相关联的团队,我完全不知道如何,甚至我是否可以在rails和这个插件中做到这一点(但插件本身不应该是一个障碍)。 我想我的主要问题是我缺乏javascript的经验,特别是与rails结合使用。 有人在他/她的应用程序中做了类似的事情,可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您的问题可能有许多不同的边缘情况。看看tokenInput方法' onResult '。

也许您可以从第一个输入字段(input-1)获取当前值,并根据input-1评估输入-2的返回json,并过滤掉您不想要的值。 您将不经意地必须在rails创建的json数组中包含所需的id元素以进行过滤。

<script type="text/javascript">
        $(document).ready(function() {
            $("#input-1").tokenInput("http://railsapp.com/your/search/action");

            $("#input-2").tokenInput("http://railsapp.com/your/search/action", {
                onResult: function (results) {
                    var input-1 = $("#input-1").val();
                    $.each(results, function (index, value) {
                        // some JS to keep only results which match input-1 values
                    });

                    return results;
                }
            });
        });
        </script>

免责声明:这只是一个想法。

希望这有帮助。

答案 1 :(得分:1)

感谢您的回答。我知道,我需要使用onResult回调但是想错了方向。所以你的答案实际上帮助我使我的方法正确。我按照我需要的方式使用95%的代码来使用这一小段代码来丢弃任何不需要的结果:

if (value.club_id != verein1){
                        results.splice(index,1)     
                    }

问题是,我不幸地发现,onResult回调仅被调用为新搜索。 TokenInput插件缓存搜索/结果以减少服务器负载。因此,当我在第二个框中输入第一个字符时,它会触发搜索,调用onResult并正确过滤我的结果。所以一切似乎都很好。但是如果我删除第一个字符并再次键入它,插件将使用缓存的结果而onResult不会被调用,结果显示为未过滤。这意味着,如果我在第一个框中输入一个俱乐部,然后在第二个框中搜索一个团队,则所有内容都会被正确过滤。但是,如果我然后决定删除俱乐部并输入另一个俱乐部(因为我选择了错误的俱乐部),团队的结果将不再被正确过滤,因为每当搜索字符串出现两次时,插件就会抛出缓存的搜索结果。 顺便说一句:缓存的结果是原始的,未经过滤的结果,而不是通过我之前的过滤得到的结果数组。

现在我不确定这是不是一个错误,或者它是否打算采用这种方式,并且我努力改变插件的源代码以改变它们也没有任何成功。