2015-09-29 5 views
0

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

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

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

$.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(); 
}; 

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

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^