Как использовать переменную внутри себя - PullRequest
0 голосов
/ 11 июня 2019

Я хочу использовать переменную внутри себя и вижу, что другие люди делают это, но почему она не работает для меня?

Это мой файл ES6

// Setup module
// ------------------------------

var FullCalendarAdmin = function () {

    //
    // Setup module components
    //
    var _componentRender = function () {

    // Basic calendar
    var _componentFullCalendarAdmin = function (events) {

        // Define element
        var calendarAgendaViewElement = document.querySelector('.fullcalendar-agenda-admin');

        // Initialize
        if (calendarAgendaViewElement) {
            var calendarAgendaViewInit = new FullCalendar.Calendar(calendarAgendaViewElement, {
                plugins: ['dayGrid', 'timeGrid', 'interaction'],
                select: function (start, end) {
                    var title = prompt("Add event:");
                    var data;
                    if (title != '') {
                        data = {
                            title: title,
                            start: start,
                            end: end
                        };
                        calendarAgendaViewInit.addEvent(data);
                    }
            }).render();

        }
    };

    //
    // Return objects assigned to module
    //

    return {
        init: function () {
            _componentRender();
        }
    }
}();


// Initialize module
// ------------------------------

document.addEventListener('DOMContentLoaded', function () {
    FullCalendarAdmin.init();
});

Как я могу использовать calendarAgendaViewInit для вызова функции addEvent без получения функции как неопределенной ошибки?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Это своего рода расширенное объяснение комментарию выше.Похоже, calendarAgendaViewElement - это просто элемент DOM, который вы нашли и присвоили переменной.Проблема в том, что вы можете вызывать методы только в тех экземплярах классов, которые теперь являются объектами с методами внутри.Если вы видели, как другие вызывали addEvent таким образом, то они, вероятно, вызывали его при создании экземпляра класса, означающего, что addEvent ранее был объявлен как часть этого класса, и они просто вызывают этот метод.

См. Пример ниже,

Если я объявлю класс следующим образом:


class Sample {
   sayHello(){
      console.log('hello')
    }
 }

Затем создадим новый объект класса 'Sample':

var sampleClass = new Sample()

Тогда я могу вызвать 'sayHello', ссылаясь на метод внутри объекта

sampleClass.sayHello() // hello

Надеюсь, что это поможет

1 голос
/ 11 июня 2019

Проблема в том, что вы вызываете .render немедленно.
Таким образом, ваш calendarAgendaViewInit является не экземпляром FullCalendar.Calendar, а результатом render метода.
Что вы можете сделать, это сначала определить calendarAgendaViewInit переменную

var calendarAgendaViewInit = new FullCalendar.Calendar(calendarAgendaViewElement, {
                plugins: ['dayGrid', 'timeGrid', 'interaction'],
                select: function (start, end) {
                    var title = prompt("Add event:");
                    var data;
                    if (title != '') {
                        data = {
                            title: title,
                            start: start,
                            end: end
                        };
                        calendarAgendaViewInit.addEvent(data);
                    }
            });

, а затем позвоните calendarAgendaViewInit.render().

...