плагин jquery вызывает общедоступную функцию внутри другой общедоступной функции

#jquery #jquery-plugins

#jquery #jquery-плагины

Вопрос:

Я определил свою базу плагина на http://docs.jquery.com/Plugins/Authoring

 (function( $ ){

  var methods = {
    init : function( options ) {  },
    show : function( options ) {  },
    hide : function( ) {  },
    update : function( content ) { 
      // How to call the show method inside the update method
      // I tried these but it does not work
      // Error: not a function
      this.show(); 
      var arguments = { param: param };
      var method = 'show';
      // Error: options is undefined
      methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));  
    }
  };

  $.fn.tooltip = function( method ) {

    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method '    method   ' does not exist on jQuery.tooltip' );
    }    

  };

})( jQuery );
  

Как вызвать метод show внутри метода update?

Редактировать:

show Метод ссылается this . Использование methods.show(options) or methods['show'](Array.prototype.slice.call( arguments, 1 )); работает для вызова show метода, но тогда ссылка на this кажется неверной, потому что я получил this.find(...) is not a function ошибку.

show Метод:

 show: function(options) {
    alert("Options: "   options);
    alert("Options Type: "   options.interactionType);
    var typeCapitalized = capitalize(options.interactionType);
    var errorList = this.find('#report'   typeCapitalized);
    errorList.html('');
},
  

Ответ №1:

 var methods = {
  init : function( options ) {  },
  show : function( options ) {  },
  hide : function( ) {  },
  update : function( options ) { 

    methods.show.call(this, options);

  }
};
  

Комментарии:

1. Я отредактировал вопрос, потому что теперь у меня проблема внутри show метода из-за ссылки на this

2. Вторым аргументом apply должен быть массив. Итак, я попробовал methods.show.apply(this, Array.prototype.slice.call( arguments, 1 ) ); с var arguments = { interactionType: 'Request' }; помощью, но теперь options в show методе не определено.

3. arguments это специальный объект, не пытайтесь объявлять свой собственный. В любом случае, я снова отредактировал свой вопрос — используйте Function.call вместо Function.apply . (Извините, я не могу сначала протестировать этот материал, было бы полезно, если бы у вас был jsfiddle, который я мог бы проверить)

Ответ №2:

Ваше использование .apply — это то, что здесь все портит. Вы намеренно меняете то, что this означает, из-за чего this.show() не работает. Если вы хотите this продолжать быть methods (что имеет смысл), вы можете сделать просто:

   return methods[ method ](Array.prototype.slice.call( arguments, 1 ));