Как бы я отправить значение из статической функции в другой объект? - PullRequest
0 голосов
/ 07 марта 2019

  (function ($, window, undefined) {
    'use strict';

    class Slider {

      static init(loop) {
        Slider.loop = loop;
        return Slider.loop;
      }

    };
    $.fn.blueSlider = function(loop, options) {
      var defaults = {

      }
      var loop = Slider.init(loop);
      console.log(loop);
      $.extend(defaults, options);
    };
  }(jQuery))

  $('div').blueSlider(true);
<div></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Я новичок в создании кода с использованием class function, поэтому прошу прощения за любые другие ошибки, которые я не упомянул в вопросе.

Я пытаюсь объединить class function и плагин jQuery. Эта строка: $.fn.blueSlider = function(loop, options), функция инициализации jQuery имеет 2 параметра, а параметр loop фактически является параметром Slider.init(). Поэтому я должен объявить новую переменную вроде этого var loop = Slider.init(loop); для доступа к значению loop.

Я ожидаю поместить параметр loop в options, чтобы он мог вызываться методом инициализации jQuery, когда я хочу изменить значение loop следующим образом:

$(className).blueSlider({
  loop: false,
  // etc.
})

Я пытался создать объект options и поместить его в параметр loop для передачи значения другому объекту, но он не работал:

$.fn.blueSlider = function(options) {
  var defaults = {

  }
  var options = {
    loop: Slider.init(loop),
  }
  $.extend(defaults, options);
};

Есть ли способы исправить эту проблему?

1 Ответ

1 голос
/ 07 марта 2019

Если вы собираетесь использовать синтаксис class, вы не хотите предоставлять пользовательскую функцию init;вместо этого предоставьте конструктор и используйте new.

Также важно помнить, что jQuery основан на множестве , что означает, что this при вызове является объектом jQuery, содержащим набор элементов.В большинстве случаев плагин должен действовать так, как если бы он был вызван для каждого из этих элементов в отдельности.Например:

(function ($, window, undefined) {
    'use strict';
    
    // Moved defaults out of the function, added
    // more for the example
    const defaults = {
      someOption: "foo",
      someOtherOption: "bar",
      color: "green"
    };

    // The class
    class Slider {
        constructor(loop = true, options) {
            // Handle initialization in the constructor
            this.options = defaults;
            this.setOptions(loop, options);
        }
        setOptions(loop, options) {
            this.loop = loop;
            this.options = Object.assign({}, this.options, options);
            // In ES2017+, you could use:
            // this.options = {...defaults, ...this.options};
        }
        // Use a method to handle applying the slider to an element
        apply($el) {
            // ...do slider's thing on $el...
            $el.css("color", this.options.color);
            $el.text("loop = " + this.loop);
        }
    }

    $.fn.blueSlider = function(loop, options) {
        // Loop through the elements
        this.each(function() {
            // Create or reuse an instance for each element
            const $el = $(this);
            let slider = $el.data("blueSlider");
            if (slider) {
                // Element already has a slider
                slider.setOptions(loop, options);
            } else {
                // Create slider for element, remember it
                slider = new Slider(loop, options);
                $el.data("blueSlider", slider);
            }
            slider.apply($el);
        });
    };
}(jQuery))

$('div.a').blueSlider(true, {color: "blue"});
$('div.b').blueSlider(false);
setTimeout(() => {
  $('div.a:first').blueSlider(false);
}, 800);
<div class="a"></div>
<div class="a"></div>
<div class="b"></div>
<div class="b"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...