【问题标题】:Filter response in jQuery autocomplete在 jQuery 自动完成中过滤响应
【发布时间】:2013-08-19 00:02:19
【问题描述】:

我正在尝试实现用于输入标签的 jQuery.autocomplete(很像这里的 SO)。但是,我不想显示列表中已有的标签。如果我已经添加了foo,我不希望它显示为建议。标签列表是从我的服务器获取的。但是,我在更改 ui.content 对象时遇到了一些问题。

我使用here找到的响应方式:

response: (event, ui)->
  # Fetch already added tags
  current = $('input#photo_tag_list').val().split(',')
  # Filter out already added tags from result
  ui.content = ui.content.filter (el) -> $.inArray(el.label, current) == -1

但是,上述方法不起作用。它仍然显示所有标签。如果我检查 ui.content 我可以看到它看起来是正确的......上面是异步的还是什么?!

奇怪的是,如果我这样做:

ui.content.push({label: "Foo", value:"Bar"})

Foo 出现在自动完成列表中。但如果我这样做:

ui.content = []

它仍然显示返回的所有内容。我希望有一个空列表。

为什么会这样?如何正确修改结果列表?

更新 根据 Andrew Whitaker 的解决方案让它工作。

【问题讨论】:

    标签: jquery jquery-ui coffeescript jquery-ui-autocomplete


    【解决方案1】:

    发生这种情况是因为 JavaScript 传递参数的方式。 ui.content 是数组的引用副本。您不能修改该引用并期望结果在函数之外可见。这更好地解释here

    对于一个简化的例子,看看这个:

    function modify(item) {
        item.arr = [];
    }
    
    var obj = {
        text: 'hi',
        arr: [1,2,3,4]
    };
    
    modify(obj);
    console.log(obj);
    

    小提琴: http://jsfiddle.net/9swwA/1/

    日志语句将显示obj.arr 仍然是[1, 2, 3, 4]。你基本上有同样的问题。


    所以要解决这个问题,您可以使用splice 从数组中删除项目。不幸的是,您将不得不添加更多代码:

    i = ui.content.length - 1
    
    while i >= 0
      currentItem = ui.content[i]
      index = $.inArray(currentItem, current)
      ui.content.splice i, 1  if index is -1
      i--
    

    【讨论】:

    • 谢谢,这很有道理。我一开始尝试了类似的方法,从末尾迭代并切片,但从未让它在咖啡脚本中工作......我会再试一次。
    • 另外,在您的解决方案中,您根据错误的索引进行拼接。我设法让它现在工作并发布了答案。还是谢谢你。
    • 啊,很抱歉我没有机会测试它。我会更新
    【解决方案2】:

    好的,我是根据 Andrew Whitaker 的回答得到的。

    咖啡:

    response: (event, ui)->
      current = $('input#photo_tag_list').val().split(',')
      for el, i in ui.content by -1
        if $.inArray(el.label, current) != -1
          ui.content.splice(i, 1)
    

    效果很好!

    【讨论】:

    • 看起来是一个使用 lodash 的好地方:lodash.com/docs。超级有效。
    • 还有,本地风格:如果您根据其他人的答案获得解决方案,请使用“更新:”部分更新问题并参考帮助您解决问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多