JS динамичные свойства класса

немного не понимаю вопроса, или реально ли делать как-то динамичные свойства в js

“Добавить новое свойство” - для добавления нового свойства в объекте (например адрес школы) и новой информации. Создает модальное окно со следующими элементами: Поле Название нового свойства - text input; Поле Данные нового свойства - text input; Кнопка “Добавить” - добавляет информацию в базу данных

Для организации бизнес логики приложения используется только возможности языка JavaScript Для организации хранения и обработки информации использовать пользовательский объект (класс) со всеми перечисленными в задании полями, коллекциями (типа set, map) и методами, конструктором, а также методами отвечающими за вывод значений.

Проект представляем собой html страницу для организации приема информации (о учеников) из формы с полями: ФИО ученика - text input Адреса ученика - text input № класса ученика - text input Признак участия в олимпиадах ученика - checkbox (true/false).

Мой класс выглядит так

const db = openDatabase('fl', 1.0, 'FL DB', 2 * 1024 * 1024);
db.transaction(function(tx) {
  tx.executeSql('CREATE TABLE IF NOT EXISTS Students (fio, address, class_num, olymp)');
});

const MainTable = document.getElementById("MainTable");
const FormCreateBtn = document.getElementById("FormCreateBtn");
const Table = document.getElementById("Table");
const FormNewPropBtn = document.getElementById("FormNewPropBtn");
const FormViewBtn = document.getElementById("FormViewBtn");
const FormNoOlympBtn = document.getElementById("FormNoOlympBtn");
const FormRemoveBtn = document.getElementById("FormRemoveBtn");
const FormClearBtn = document.getElementById("FormClearBtn");
const studentFIO = document.getElementById("studentFIO");
const studentAddress = document.getElementById("studentAddress");
const studentClass = document.getElementById("studentClass");
const studentOlymp = document.getElementById("studentOlymp");
const StudentsIdsList = document.getElementById("StudentsIdsList");

class Student {
  constructor(fio, address, class_num, olymp) {
    this.fio = fio;
    this.address = address;
    this.class_num = class_num;
    this.olymp = olymp;
  }

  set setId(id) {
    this.id = id;
  }

  get getId() {
    return this.id;
  }
}

class Students {
  constructor() {
    this.students = [];
  }

  addStudent(student) {
    this.students.push(student);
    addStudentToStudentList(student);
  }

  getStudent(id) {
    let stud = null
    this.students.map(function(student) {
      student.getId === id ? stud = student : null
    })
    return stud
  }

  getStudents() {
    return this.students;
  }

  getStudentsWithOutOlymp() {
    return this.students.filter(function(student) {
      return student.olymp === 'false';
    })
  }

  saveStudent(student) {
    let id = null
    db.transaction(function(tx) {
      tx.executeSql('INSERT INTO Students (fio, address, class_num, olymp) VALUES (?, ?, ?, ?)', [student.fio, student.address, student.class_num, student.olymp], function(tx, results) {
        console.log(results.insertId)
        student.setId = results.insertId
        students.addStudent(student)
        alert('Success');
      });
    });
    console.log('student saved', student.getId);

  }

  removeStudent(id) {
    const curStudent = this.getStudent(+id);
    const index = this.students.indexOf(curStudent);
    this.students.splice(index, 1);
    db.transaction(function(tx) {
      tx.executeSql('DELETE FROM Students WHERE rowid = ?', [id], function(tx, results) {
        alert('Success');
        deleteStudentToStudentList();
      });
    });

  }

  updateStudent(id, student) {
    this.students[id] = student;
  }
}

let students = new Students();

function loadStudents() {
  db.transaction(function(tx) {
    tx.executeSql(`SELECT rowid as id,* FROM Students`, [], function(tx, results) {
      for (let i = 0; i < results.rows.length; i++) {
        let student = new Student(results.rows.item(i).fio, results.rows.item(i).address, results.rows.item(i).class_num, results.rows.item(i).olymp);
        student.setId = results.rows.item(i).id;
        students.addStudent(student);
      }
    });
  });
}

loadStudents()

function addStudentToStudentList(student) {
  StudentsIdsList.innerHTML += `<option value="${student.getId}">${student.fio}</option>`;
}

function deleteStudentToStudentList() {
  let index = StudentsIdsList.selectedIndex;
  StudentsIdsList.removeChild(StudentsIdsList[index]);
}

FormClearBtn.onclick = function(e) {
  e.preventDefault()
  clearForm();
  alert("Success")
}
FormCreateBtn.onclick = function(e) {
  e.preventDefault()
  let student = new Student(studentFIO.value, studentAddress.value, studentClass.value, studentOlymp.checked);
  students.saveStudent(student)
  clearForm();
}
FormViewBtn.onclick = function(e) {
  e.preventDefault()
  if (!students.getStudents().length) {
    alert("Нет учеников")
  }
  Table.tBodies[0].innerHTML = '';
  students.getStudents().forEach(function(student) {
    Table.tBodies[0].innerHTML += `<tr><td scope="row">${student.getId}</td><td>${student.fio}</td><td>${student.address}</td><td>${student.class_num}</td><td>${student.olymp === 'true' ? "Да" : "Нет"}</td>`
  });
}
FormNoOlympBtn.onclick = function(e) {
  e.preventDefault()
  if (!students.getStudentsWithOutOlymp().length) {
    alert("Нет подходящих учеников")
  }
  Table.tBodies[0].innerHTML = ``
  students.getStudentsWithOutOlymp().forEach(function(student) {
    Table.tBodies[0].innerHTML += `<tr><td scope="row">${student.getId}</td><td>${student.fio}</td><td>${student.address}</td><td>${student.class_num}</td><td>Нет</td>`
  });
}
FormRemoveBtn.onclick = function(e) {
  e.preventDefault()
  if (!+StudentsIdsList.value) {
    alert("Выберите студента");
    return false
  }
  students.removeStudent(StudentsIdsList.value);
}


function clearForm() {
  studentFIO.value = "";
  studentAddress.value = "";
  studentClass.value = "";
  studentOlymp.checked = false;
}
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="">
  <meta name="author" content="">
  <meta name="generator" content="">
  <title>Students</title>

   <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
  

  <!-- Favicons -->
  <link rel="icon" href="/favicon.ico">
  <meta name="theme-color" content="#712cf9">

  <!-- Custom styles for this template -->
  <link href="/css/main.css" rel="stylesheet">
</head>

<body>

  <div class="col-lg-10 mx-auto p-4 py-md-5">
    <header class="d-flex align-items-center pb-4 mb-5 border-bottom">
      <h1 class="mx-auto h4 text-center"> Student data</h1>
    </header>

    <main>
      <div class="main-form" id="MainForm">
        <form class=" col-lg-8 mx-auto ">
          <div class="mb-3">
            <label for="studentFIO" class="form-label">ФИО:</label>
            <input type="text" class="form-control" id="studentFIO" aria-describedby="studentFIOHelp">
            <div id="studentFIOHelp" class="form-text">ФИО ученика</div>
          </div>
          <div class="mb-3">
            <label for="studentAddress" class="form-label">Адреса:</label>
            <input type="text" class="form-control" id="studentAddress" aria-describedby="studentAddressHelp">
            <div id="studentAddressHelp" class="form-text">Адреса ученика</div>
          </div>
          <div class="mb-3">
            <label for="studentClass" class="form-label">№ класса:</label>
            <input type="text" class="form-control" id="studentClass" aria-describedby="studentClassHelp">
            <div id="studentClassHelp" class="form-text">№ класса ученика</div>
          </div>
          <div class="mb-3 form-check">
            <input type="checkbox" class="form-check-input" id="studentOlymp">
            <label class="form-check-label" for="studentOlymp">Олимпиадник?</label>
          </div>
        </form>
        <div class="col-lg-8 mx-auto">
          <ul class="nav ">
            <li class="nav-item m-1">
              <a class="btn btn-primary" id="FormCreateBtn" role="button">Добавить ученика</a>
            </li>
            <li class="nav-item m-1">
              <a class="btn btn-info" id="FormClearBtn" role="button">Очистить форму</a>
            </li>
            <li class="nav-item m-1">
              <a class="btn btn-primary" id="FormNewPropBtn" data-bs-toggle="modal" data-bs-target="#createModal" role="button">Добавить новое свойство</a>
            </li>
          </ul>
          <ul class="nav">
            <li class="nav-item m-1">
              <a class="btn btn-primary" id="FormViewBtn" role="button">Просмотр учеников</a>
            </li>
            <li class="nav-item m-1">
              <a class="btn btn-primary" id="FormNoOlympBtn" role="button">Не олимпиадники</a>
            </li>
            <li class="nav-item m-1">
              <div class="row g-1">
                <select class="col g-1 form-select form-select-sm" id="StudentsIdsList" aria-label=".form-select-sm example">
                  <option>Выберите ученика</option>
                </select>
                <a class="col g-1 btn btn-danger" id="FormRemoveBtn" role="button" href="#">Удалить запись</a>
              </div>
            </li>
          </ul>
        </div>
      </div>

      <div class="main-table mt-5" id="MainTable">
        <table id="Table" class="table">
          <thead>
            <tr>
              <th scope="col">#</th>
              <th scope="col">ФИО</th>
              <th scope="col">Адреса</th>
              <th scope="col">№ класса</th>
              <th scope="col">Участие в олимпиалде</th>
            </tr>
          </thead>
          <tbody>
          </tbody>
        </table>
      </div>
      <!-- Modal -->
      <div class="modal fade" id="createModal" tabindex="-1" aria-labelledby="createModal" aria-hidden="true">
        <div class="modal-dialog">
          <div class="modal-content">
            <div class="modal-header">
              <h1 class="modal-title fs-5" id="createModalLabel">Modal title</h1>
              <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
              <button type="button" class="btn btn-primary">Добавить</button>
            </div>
          </div>
        </div>
      </div>
    </main>
    <footer class="pt-5 my-5 text-muted border-top">

    </footer>
  </div>

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-mQ93GR66B00ZXjt0YO5KlohRA5SY2XofN4zfuZxLkoj1gXtW8ANNCe9d5Y3eG5eD" crossorigin="anonymous"></script>

</body>

</html>


Ответы (0 шт):