Обратный вызов плагина jQuery внутри функции

Итак, я все еще пытаюсь разобраться в плагинах DIY jQuery, но одна из вещей, которые мне трудно понять, это то, как сделать обратный вызов из функции внутри плагина. Когда я делаю обратный вызов вне функции, он работает.

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

Рабочий пример:

$.fn.mvSelect = function(options){
    var settings = $.extend({
        selectColor: "#cccccc",
        search: true,
        checkbox: true,
        onItemSelected: function () { },
        onItemChecked: function () { }
    }, options);

    this.addClass("ulStyle");
    this.find("li").each(function(){
        $(this).addClass("itemStyle");

        $(this).click(function (e) {
            $("*").removeClass("itemSelected");
            $(this).addClass("itemSelected");
            settings.onItemSelected.call($(this)); // <-- this one works
        });
    });
};

Нерабочий пример:

$.fn.mvSelect = function (options) {
    var settings = $.extend({
        selectColor: "#cccccc",
        search: true,
        checkbox: true,
        onItemSelected: function (e) { },
        onItemChecked: function (e) { }
    }, options);

    function refreshData() {
        that.find("li").each(function () {
            $(this).addClass("itemStyle");

            $(this).click(function (e) {
                $("*").removeClass("itemSelected");
                $(this).addClass("itemSelected");
                settings.onItemSelected.call($(this)); // <-- Does not work
            });

        });
        return that;
    };

    if (someThing === "refreshData")
        refreshData();
};

Я предполагаю, что это как-то связано с областью действия, поскольку, когда я просматриваю область действия этого элемента настроек, он пару раз показывает закрытие в нерабочей версии, а в рабочей версии он не показывает закрытие. В любом случае, я не могу найти информацию о том, как заставить его работать правильно. Сами события работают, это обратный вызов, который не возвращает мой другой код.


person Mungoid    schedule 29.09.2015    source источник


Ответы (1)


Где вы заявили "это"? Поскольку вы работаете с функциями (что означает разные области видимости), вам нужно убедиться, что «это» каждый раз является одним и тем же «это». интерфункция не имеет доступа к внешней this. Вы можете использовать: var that = this; в функции refreshdata. Затем используйте «это» вместо «это» в следующем коде. Надеюсь, вы понимаете, что я имею в виду.

person Hiltje    schedule 01.10.2015