我试图实现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 = []
它仍然显示一切恢复。 我希望一个空列表。
为什么会这样? 如何正确地修改结果列表?
更新明白了基于安德鲁·惠特克的解决方案正常工作。
这是因为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--
好吧,我得到了它的基础上安德鲁·惠特克的回答。
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)
伟大的作品!