如何实现一个方法来更新jquery插件中的选项?

时间:2011-08-23 16:54:59

标签: javascript jquery jquery-plugins

我正在尝试调整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 个答案:

答案 0 :(得分:3)

这似乎是因为您附加了默认设置,而不是在init函数中从此行扩展的实际设置哈希。

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...