jQuery плагины - для чего нужен init()?

310
20 августа 2017, 07:15

Создаю jQuery-плагин. По инструкции в интернете надо делать так:

$.fn.tooltip = function( method ) {
    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 + ' не существует для jQuery.tooltip' );
    }      
  };

Я изменил код так:

$.fn.tooltip = function( method ) {
            var options = $.extend( {
                'location'         : 'top'
            }, arguments[1]?arguments[1]:arguments[0]);
            // логика вызова метода
            if ( methods[method] ) {
                methods.init.apply( this, [options] );
                var $this = this;
                this.each(function () {
                    return methods[method].apply( $this, [options] );
                });
            } else if ( typeof method === 'object' || ! method ) {
                return methods.init.apply( this, [options] );
            } else {
                $.error( 'Метод с именем ' +  method + ' не существует для jQuery.tooltip' );
            }
            return this;
        };

Сам метод init такой:

var methods = {
            init : function( options ) {
                return this.each(function(){
                    var $this = $(this);
                    var data = $this.data();
                    // Если плагин ещё не проинициализирован
                    if ( jQuery.isEmptyObject(data) ) {
                        console.log('method init');
                        /*
                         * Тут выполняем инициализацию
                         */
                        $.each(options, function (index, value) {
                            $this.data(index, value);
                        });
                    }
                });
            },
           show : function( options ) {
                console.log('method show');
                console.log($(this).data());
            }
        };

Т.е., если плагин для объекта вызывается впервые, неважно какой метод плагина вызывается, сначала происходит его init(). Если же инициализация для объекта уже была произведена, то она пропускается.

Только вот зачем здесь инициализация, что в ней делать нужно? Я в ней записываю все данные в data() объекта. А значит, в остальных методах плагина, например в show(), я должен брать данные из хранилища data(), а не из передаваемых аргументов arguments.

Но если я вызову плагин для объекта во второй раз с новыми параметрами, то во второй раз init() не выполнится, а значит в data() останутся старые данные, которые были присвоены при первом вызове.

Отсюда следует, что данные из data() брать неправильно, а вместо этого нужно пользоваться просто arguments, которые мы передаём всякий раз при вызове плагина.

Но тогда зачем нам метод init()?

READ ALSO
Получение generic-типа

Получение generic-типа

Есть нижеприведённый кодКод пытается сделать класс для создания обработчиков React-компонента

205
Передать значение чекбокс с пробелом

Передать значение чекбокс с пробелом

Здравствуйте! проблема такая как передать значение чекбокса если это значение с пробелом :

572
В каких случаях используется new FormData() при отправке данных с формы?

В каких случаях используется new FormData() при отправке данных с формы?

В каких случаях используется FormData ( const formData = new FormData();) при отправке данных с формы POST запросомможно просто же отправить в body данные с формы

215