Передача / хранение массивов по ссылке? - PullRequest
1 голос
/ 19 августа 2011

Я довольно новичок в 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 обновляется по этому запросу. Однако переменная tokens внутри класса автозаполнения остается в виде массива, который был инициализирован как.

Как получить, чтобы переменная tokens указывала на те же данные, что и переменная activities?

1 Ответ

1 голос
/ 19 августа 2011

Проблема в том, что вы переопределяете массив. Вы должны заменить элементы вместо этого. Вы можете добавлять и удалять элементы на месте с помощью 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.

Ссылка: concat, splice, apply

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...