jQuery的自动完成滤波器响应(Filter response in jQuery autocom

2019-10-18 12:30发布

我试图实现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 = []

它仍然显示一切恢复。 我希望一个空列表。

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

更新明白了基于安德鲁·惠特克的解决方案正常工作。

Answer 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--


Answer 2:

好吧,我得到了它的基础上安德鲁·惠特克的回答。

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)

伟大的作品!



文章来源: Filter response in jQuery autocomplete