1

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

我使用此处找到的响应方法:

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 的解决方案工作。

4

2 回答 2

1

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

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

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--
于 2013-08-16T14:54:22.317 回答
0

好的,我是根据 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)

效果很好!

于 2013-08-16T16:14:38.763 回答