通过引用传递/存储数组?

时间:2011-08-19 09:40:59

标签: javascript mootools

我对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变量相同的数据?

1 个答案:

答案 0 :(得分:1)

问题是你要覆盖数组。您应该替换元素。您可以使用splice [MDN]

就地添加和删除元素
Activities.splice(0, Activities.length, _json[0], _json[1], ...);

这将删除所有元素(从0Activities.length)并添加_json数组中的每个元素。

但是_json可能包含未知数量的元素,并且像我们上面那样对其进行硬编码非常糟糕。幸运的是,我们可以使用apply [MDN]方法调用具有可变数量参数的方法,以数组形式提供:

var params = [0, Activities.length].concat(_json);
Activities.splice.apply(Activities, params);

这相当于上面的调用,但添加了_json的所有元素。

参考: concatspliceapply

相关问题