Как добавить DOM элемент на HTML страницу с typescript в Ionic 4

Мой html компонент выглядит так

<ion-header>
  <ion-toolbar>
    <ion-title>Мои записи</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content fullscreen>

  <ion-button expand="full" (click)="updateEntryList()" color="warning"> Обновить список записей</ion-button>


  <div class="entry">
      <div class="docFullname"></div>
      <div class="rating"></div>
      <div class="workPlace"></div>
      <div class="price"></div>
      <div class="time"></div>
  </div>


</ion-content>

А функция клика на кнопку в классе компонента так

  async updateEntryList() {
    const toast = await this.toastController.create({
      message: "Список записей был обновлен",
      duration: 3000
    });
    toast.present();

    fetch("../../../assets/entryData/entryData.json")
    .then( response => {
      if (!response.ok) console.log("Promise has been failed");
      return response.json();
    })
    .then(data => {
      for (var key in data)
        console.log(key)
    });




    fetch("../../../assets/entryData/entryData.json")
    .then(response => {
      if (!response.ok) console.log("Yup, it's wrong");
      return response.json();
    })
    .then(data => {
      const fullnameElems = document.getElementsByClassName("docFullname");
      const ratingElems = document.getElementsByClassName("rating");
      const workPlaceElems = document.getElementsByClassName("workPlace");
      const priceElems = document.getElementsByClassName("price");
      const timeElems = document.getElementsByClassName("time");

      for (var i = 0; i < fullnameElems.length; i++) {
        (fullnameElems[i] as HTMLDivElement).textContent = data.fullname;
        (ratingElems[i] as HTMLDivElement).textContent = data.rating;
        (workPlaceElems[i] as HTMLDivElement).textContent = data.workPlace;
        (priceElems[i] as HTMLDivElement).textContent = data.price;
        (timeElems[i] as HTMLDivElement).textContent = data.time;
      }
    });


  }

Как видите в классе компонента я просто добавляю в теги текстовые данные которые получаю из .json файла. Но при таком способе я просто переопределяю текстовое содержимое этих тегов, а мне нужно создать при клике точно такие же элементы с такими же текстовым содержимым. Проще говоря мне нужно при клике как бы дублировать это

  <div class="entry">
      <div class="docFullname"></div>
      <div class="rating"></div>
      <div class="workPlace"></div>
      <div class="price"></div>
      <div class="time"></div>
  </div>

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

Автор решения: qwabra

Если !!!

Если предположить что Ionic - это просто CustomElemtnts и с ним можно работать как с обычным DOM.

abstract class Data {
    fullname: string;
    rating: string;
    workPlace: string;
    price: number;
    time: number;
}
class FakeData extends Data {
    static i = 0
    constructor() { super(); FakeData.i++ }

    fullname: string = `fullname ${FakeData.i}`
    rating: string = `rating ${FakeData.i}`
    workPlace: string = `workPlace ${FakeData.i}`
    price: number = FakeData.i
    time: number = FakeData.i
}

const gen = (data: Data) => `
  <div class="entry">
      <div class="docFullname">${data.fullname}</div>
      <div class="rating">${data.rating}</div>
      <div class="workPlace">${data.workPlace}</div>
      <div class="price">${data.price}</div>
      <div class="time">${data.time}</div>
  </div>
`

const el: HTMLElement = document.body

el.insertAdjacentHTML('beforeend', gen(new FakeData))
el.insertAdjacentHTML('beforeend', gen(new FakeData))
el.insertAdjacentHTML('beforeend', gen(new FakeData))

тут можно запустить

"use strict";
class Data {
}
class FakeData extends Data {
    constructor() {
        super();
        this.fullname = `fullname ${FakeData.i}`;
        this.rating = `rating ${FakeData.i}`;
        this.workPlace = `workPlace ${FakeData.i}`;
        this.price = FakeData.i;
        this.time = FakeData.i;
        FakeData.i++;
    }
}
FakeData.i = 0;
const gen = (data) => `
  <div class="entry">
      <div class="docFullname">${data.fullname}</div>
      <div class="rating">${data.rating}</div>
      <div class="workPlace">${data.workPlace}</div>
      <div class="price">${data.price}</div>
      <div class="time">${data.time}</div>
  </div>
  <hr>
`;
const el = document.body;
el.insertAdjacentHTML('beforeend', gen(new FakeData));
el.insertAdjacentHTML('beforeend', gen(new FakeData));
el.insertAdjacentHTML('beforeend', gen(new FakeData));

→ Ссылка