#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 ));