Как добавить 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));