在jQuery自动完成中过滤响应

时间:2013-08-16 14:30:13

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

我正在尝试实现用于输入标签的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的解决方案开始工作。

2 个答案:

答案 0 :(得分: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--

答案 1 :(得分:0)

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

Coffescript:

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)

效果很好!