Как реализовать метод для обновления параметров в плагине jquery? - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь настроить плагин jquery (https://raw.github.com/loopj/jquery-tokeninput/master/src/jquery.tokeninput.js), чтобы добавить метод, который обновил бы конкретную настройку по умолчанию (hintText).

Уже предоставлено несколько методов:

var methods = {
    init: function(url_or_data_or_function, options) {
        var settings = $.extend({}, DEFAULT_SETTINGS, options || {});

        return this.each(function () {
            $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
        });
    },
    clear: function() {
        this.data("tokenInputObject").clear();
        return this;
    },
    add: function(item) {
        this.data("tokenInputObject").add(item);
        return this;
    },
    remove: function(item) {
        this.data("tokenInputObject").remove(item);
        return this;
    },
    get: function() {
        return this.data("tokenInputObject").getTokens();
    }
}

И я добавил это:

updateHintText: function (hintText) {
     DEFAULT_SETTINGS.hintText = hintText;
} 

Это обновляет его, НО, он не работает на уже созданном экземпляре. Например, я вызываю этот метод так:

$("#textbox1").tokenInput("updateHintText", 'updated hint');

Но когда раскрывающийся список подсказок отображается в следующий раз, он по-прежнему отображает исходную подсказку:

function show_dropdown_hint () {
    if(settings.hintText) {
        dropdown.html("<p>"+settings.hintText+"</p>");
        show_dropdown();
    }
}

Так что, хотя DEFAULT_SETTINGS.hintText обновляется, settings.hintText по-прежнему ссылается на переданную исходную настройкупри создании экземпляра плагина - что имеет смысл.

Итак, как бы вы изменили мой метод updateHintText (), чтобы settings.hintText возвращал новый параметр? Прямо сейчас я сделал обходной путь, чтобы создатьновая переменная, которая будет содержать новое значение настройки, и изменила метод show_dropdown_hint (), чтобы использовать эту новую переменную вместо settings.hintText, если она не пуста.Я бы предпочел просто использовать объект настроек.

Спасибо.

1 Ответ

3 голосов
/ 23 августа 2011

Похоже, что это связано с тем, что вы присоединяетесь к настройкам по умолчанию, а не к хешу фактических настроек, который был расширен из этой строки в функции инициализации.

var settings = $.extend({}, DEFAULT_SETTINGS, options || {});

Проблема в том, что этот хеш настроекнаходится за пределами области действия вашего метода, поэтому вы не можете получить к нему доступ.

Попробуйте переместить создание экземпляров параметров за пределы метода init, чтобы иметь к нему доступ.Затем вы можете использовать свою функцию для ее изменения:

// Additional public (exposed) methods
var settings = {};
var methods = {
init: function(url_or_data_or_function, options) {
    settings = $.extend({}, DEFAULT_SETTINGS, options || {});

    return this.each(function () {
        $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
    });
},
updateHintText: function (hintText) {
     settings.hintText = hintText;
}
//..other methods...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...