Вызов функции из кода котла плагина jquery

Я нашел хороший плагин jQuery, и он использует шаблон плиты котла. Все работает нормально, но я не могу вызвать внутреннюю функцию для получения выбранных элементов. Ниже представлена ​​конструкция этого плагина:

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

    // constructor
    var SearchableOptionList = function ($element, options) {
        this.$originalElement = $element;
        this.options = options;

        this.metadata = this.$originalElement.data('sol-options');
    };

    // plugin prototype
    SearchableOptionList.prototype = {

        DATA_KEY: 'sol-element',

        // default option values
        defaults: {            
            ... 
        },

        // initialize the plugin
        init: function () {
            this.config = $.extend(true, {}, this.defaults, this.options, this.metadata);

            ...

            return this;
        },

        //some functions
        ...

        selectAll: function () {
            ...
        },

        deselectAll: function () {
            ...
        },

        getSelection: function () {
            return this.$selection.find('input:checked');
        }
    };

    // jquery plugin boiler plate code
    SearchableOptionList.defaults = SearchableOptionList.prototype.defaults;
    window.SearchableOptionList = SearchableOptionList;

    $.fn.searchableOptionList = function (options) {
        var result = [];
        this.each(function () {
            var $this = $(this),
                $alreadyInitializedSol = $this.data(SearchableOptionList.prototype.DATA_KEY);

            if ($alreadyInitializedSol) {
                result.push($alreadyInitializedSol);
            } else {
                var newSol = new SearchableOptionList($this, options);
                result.push(newSol);

                setTimeout(function() {
                    newSol.init();
                }, 0);
            }
        });

        if (result.length === 1) {
            return result[0];
        }

        return result;
    };

}(jQuery, window, document));

Полный код можно найти на GitHub.

Я пытаюсь вызвать функцию getSelection, как показано ниже:

// initialize sol
    var s = $('#my-select').searchableOptionList({
        maxHeight: '150px',
        showSelectAll: true
    });

    s.selectAll();

Я получаю сообщение об ошибке:

TypeError: this.config is undefined

Можно ли вызывать функции, используя этот шаблон котельной панели?

Вы можете поиграть на jsfiddle


person Nolesh    schedule 15.04.2016    source источник


Ответы (1)


Я считаю, что строка 1031 является виновником

        setTimeout(function() {
            newSol.init();
        }, 0);

Поскольку инициализация отложена, код не готов, когда вы его сразу вызываете. Лучшее решение - отложить и ваш звонок, но нет гарантии, что он будет инициализирован.

setTimeout(function(){s.selectAll()},1000);

Лучшее решение - использовать события подключаемого модуля, когда он был инициализирован.

$('#my-select').searchableOptionList({
  maxHeight: '150px',
  events: {
    onInitialized: function() {
      this.selectAll();
    }
  }
});

скрипка

person Community    schedule 15.04.2016
comment
Спасибо! Не могли бы вы объяснить, почему автор использует setTimeout? Это необходимо? - person Nolesh; 15.04.2016
comment
Я предполагаю, что это потому, что плагин разрешает удаленные данные, поэтому он обрабатывает все данные асинхронно. - person ; 15.04.2016
comment
Если я не собираюсь использовать асинхронные данные, могу ли я это пропустить? - person Nolesh; 15.04.2016
comment
Можно, но оставить это никому не повредит. Обратите внимание, что есть еще одно место, где время ожидания нужно было бы удалить setTimeout(function () { sol._initializeData(); скрипка - person ; 15.04.2016
comment
Отлично! Теперь все работает так, как я ожидал. Большое спасибо за помощь! Для тех, кто не хочет хранить экземпляр плагина, можно использовать $('#my-select').searchableOptionList().selectAll(); - person Nolesh; 15.04.2016