Попытка получить доступ EventHandler в своем собственном классе к методу другого класса

#javascript #class #oop #dom

#javascript #класс #ооп #dom

Вопрос:

Я пытаюсь понять, как использовать классы для разделения моих функций по их назначению.

Я создаю приложение со списком задач, используя классы. (Я знаю, что это может быть не идеальным вариантом использования class, но все же хотел привыкнуть к использованию class)

Я создал класс CreateTodoList с конструктором для ToDoList и todos для хранения данных.

таким образом, addTodo в основном переводит текст, полученный из EventHandler, в todos (массив) и создает элемент DOM, используя addtoList(текст).

Вне класса CreateTodoList я создал другой класс под названием «События», где он будет обрабатывать все события из пользовательских вводов. все, что для этого потребуется, это вызвать функцию addTodo, передающую введенное пользователем значение.

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

Не могли бы вы указать, что не так с приведенным ниже кодом, и, возможно, объяснить, как это работает? Заранее спасибо.

 
const add = document.querySelector('#btn_add');
let addInput = document.querySelector('#add');
const form = document.querySelector('#form');
class CreateTodoList {
  constructor(list) {
    this.todoList = list;
    this.todos = [];
  }


  addtoList(text) {
    let checkboxEl = document.createElement('span');
    checkboxEl.classList.add('round');
    let checkboxEl2 = document.createElement('input');
    checkboxEl2.id = 'checkbox';
    checkboxEl2.type = 'checkbox';
    let checkboxEl3 = document.createElement('label');
    checkboxEl3.htmlFor = 'checkbox';
    checkboxEl.appendChild(checkboxEl2);
    checkboxEl.appendChild(checkboxEl3);

    let todoTextEl = document.createElement('input');
    todoTextEl.value = text;
    todoTextEl.disabled = true;
    todoTextEl.classList.add('edit_input');
    todoTextEl.id = 'edit_input';
    todoTextEl.type = 'text';
    todoTextEl.name = 'edit_input';
    let todoTextEl2 = document.createElement('label');
    todoTextEl2.htmlFor = 'edit_input';

    let editEl = document.createElement('i');
    editEl.classList.add('far');
    editEl.classList.add('fa-edit');

    let deleteEl = document.createElement('i');
    deleteEl.classList.add('far');
    deleteEl.classList.add('fa-trash-alt');

    let dateEl = document.createElement('small');
    dateEl.textContent = timeago.format(new Date());

    let liEl = document.createElement('li');
    liEl.appendChild(checkboxEl);
    liEl.appendChild(todoTextEl);
    liEl.appendChild(todoTextEl2);
    liEl.appendChild(editEl);
    liEl.appendChild(deleteEl);
    liEl.appendChild(dateEl);

    let list = document.querySelector('ul');
    list.appendChild(li);

    return liEl;
  }

  addTodo(text) {
    this.todos.push(text);
    this.todoList.appendChild(CreateTodoList.addtoList(text));
  }


class Events{
  add.eventHandler('click', (e) => {
  e.preventDefault();
  let userText = document.querySelector('#userInput').value;
  CreateTodoList.addTodo(userText);
});
}
  

Ответ №1:

Есть два способа решить эту проблему. Первый метод заключается в создании экземпляра класса CreateTodoList. Классы — это данные, смешанные с функциями, которые манипулируют этими данными. Поскольку классы являются данными, вам необходимо создать переменную для их данных, иначе они не существуют с точки зрения кода. При этом создается экземпляр класса, отсюда и название instantiation:

 class Events{
  add_events(){
    add.eventHandler('click', (e) => {
      e.preventDefault();
      let userText = document.querySelector('#userInput').value;

      // Creating an instance
      let todoList = CreateTodoList();
      todoList.addTodo(userText);
    });
  }
}
  

Если вы хотите использовать классы в качестве пространства имен для организации функций, как вы пытаетесь сделать в своем примере кода, тогда вам нужно использовать второй метод, который использует ключевое слово ‘static’.

 class CreateTodoList{

  // defining addTodo as static
  static function addTodo(text){
    // adding todo list
  }
}
  

Это сообщает классу, что вы не пытаетесь манипулировать его данными. Затем вы можете вызвать функцию прямо из имени класса.

 class Events{
  add.eventHandler('click', (e) => {
    e.preventDefault();
    let userText = document.querySelector('#userInput').value;

    // calling the static function from the class name
    CreateTodoList.addTodo(userText);
  });
}
  

Подробнее о ключевом слове static смотрите здесь:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static