我对javascript很新。我下载了一些代码来为搜索框创建一个自动完成程序,但它没有像我预期的那样工作。
这是我下载的代码:
Autocompleter.Local = new Class({
Extends: Autocompleter,
initialize: function (element, tokens, options) {
this.parent(element, options);
console.log(tokens); // I added this
this.tokens = tokens;
},
query: function () {
console.log(this.tokens); // and this
this.update(this.filter());
}
});
要使用此代码,请执行以下操作:
var Activities = ['aa', 'bb', 'cc', 'abcd'];
function InitializePage() {
new Autocompleter.Local('txtSearch', Activities, {
'minLength': 1, // We wait for at least one character
'overflow': false, // Overflow for more entries
'selectMode': 'type-ahead'
});
}
window.addEvent('domready', function () {
InitializePage();
});
初始化函数的tokens
参数是自动完成程序可能建议的所有可能事物的数组。 filter()
函数会过滤这些函数,因此只会向用户显示相关的函数。我想要做的是在不同时间更改tokens
数组,以便向用户建议不同的内容。
我试过这样做:
new Request.JSON({ method: 'get', url: 'handler/GetActivities.ashx', autoCancel: true, urlEncoded: false, secure: false,
headers: { "Content-type": "application/json" },
onSuccess: function (_json, _jsonText) {
Activities = _json;
}
}).send();
我已确认此请求正在更新Activities
变量。但是,autocompleter类中的tokens
变量仍然是初始化为的数组。
如何获取它以使tokens
变量指向与activities
变量相同的数据?
答案 0 :(得分:1)
问题是你要覆盖数组。您应该替换元素。您可以使用splice
[MDN]:
Activities.splice(0, Activities.length, _json[0], _json[1], ...);
这将删除所有元素(从0
到Activities.length
)并添加_json
数组中的每个元素。
但是_json
可能包含未知数量的元素,并且像我们上面那样对其进行硬编码非常糟糕。幸运的是,我们可以使用apply
[MDN]方法调用具有可变数量参数的方法,以数组形式提供:
var params = [0, Activities.length].concat(_json);
Activities.splice.apply(Activities, params);
这相当于上面的调用,但添加了_json
的所有元素。