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