Глобальный объект JS, ошибка при вызове открытого метода

#jquery #javascript-objects

#jquery #javascript-объекты

Вопрос:

У меня есть глобальный объект jQuery, определенный во внешнем файле:

 var App = function () {

    function handleTableRowSelection()
    {
        /*
        TRs being generated dynamically via json AJAX call. 
        Select nearest static element then pass in TRs.
        */
        $('table.allow-selection tbody').on('click', 'tr', function(e)
        {
            /*Don't change row class if clicking on a link (HTMLAnchorElement), or any other sub-element*/
            if ((e.target instanceof HTMLTableCellElement) == true)
            {
                var row = $(this);

                row.find('td').each(function()
                {
                    $(this).toggleClass('user-selected');
                });
            }
        });
    }

    return {
        init: function ()
        {
            handleTableRowSelection();
        },

    };
}();
  

Когда я вызываю App.init(); в моем $ (документе).готово, он отлично работает (из моего шаблона основного блейда), хотя я не передаю никаких параметров в handleTableRowSelection.

Когда я пытаюсь вызвать App.handleTableRowSelection('#details', 'table.allow-selection tbody tr') из подшаблона для одного представления, я получаю «undefined — это не функция».

Я вызываю метод init в моем главном шаблоне следующим образом: App.init();

Я думал, что смогу получить доступ к объекту приложения (его находит завершение кода моей IDE), не так ли?

Ответ №1:

App устанавливается значение IIFE, которое возвращает структуру, содержащую { init: <your function> } . Никакие другие функции не предоставляются за пределами IIFE — в этом весь смысл IIFE при использовании таким образом: предоставлять «частное» хранилище для функций и экспортировать общедоступный интерфейс.

Если вы хотите иметь возможность публично вызывать эту функцию с таким именем, вашему последнему return необходимо сделать ее доступной как свойство объекта, который он «экспортирует»:

 return {
    init: function ()
    {
        handleTableRowSelection();
    },
    handleTableRowSelection: function () {
        handleTableRowSelection();
    }
};
  

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

1. Не вызовет ли это handleTableRowSelection() дважды?

2. Нет, это не так. Вы возвращаете объект с функцией, которая вызывает эту функцию один раз.

3. Тогда как App.init() (в моем главном шаблоне) запустить метод handle, если он только возвращает его?

4. Это не так; Я предполагал, что вы это делаете. В нынешнем виде то, что вы написали, потребовало бы от вас выполнения App.init() для вызова этой функции.