#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()
для вызова этой функции.