Je voudrais afficher du HTML formaté à l'aide de la fonction de script de type dans un composant angulaire, je voulais qu'il affiche une question de type différent, j'ai essayé ceci,
<div class="row justify-content-center">
<div class="col-12 col-lg-6">
<h2>Questions</h2>
{{displayQCM()}}
{{displayQuestion()}}
{{displayTrueOrFalse()}}
</div>
</div>
import {Component, OnInit} from '@angular/core';
import {TP, Question, Qtype} from "../tp";
import * as Exercice from '../assets/Exercice.json';
@Component({
selector: 'app-tp',
templateUrl: './tp.component.html',
styleUrls: ['./tp.component.css']
})
export class TpComponent implements OnInit {
constructor() {
}
ngOnInit(): void {
}
displayQCM(question: Question) {
return `
<div>
<hr class="w-100">
<h3>Question n°${question.number} ${question.questionType}</h3>
<p>${question.questionContent}</p>
...
QCM question element
...
</div>
`;
}
displayTrueOrFalse(question: Question) {
return `
<div>
<hr class="w-100">
<h3>Question n°${question.number} ${question.questionType}</h3>
<p>${question.questionContent}</p>
...
true or false question element
...
</div>
`;
}
displayQuestion(question: Question) {
return `
<div>
<hr class="w-100">
<h3>Question n°${question.number} ${question.questionType}</p>
<p>${question.questionContent}</p>
...
normal question element
...
</div>
`;
}
}
mais le HTML ne s'affiche que sous forme de texte brut en écrivant entièrement le code sur la page, savez-vous comment résoudre ce problème?
EDIT: le code édité pour être plus dans le contexte, la question vient d'un json et il y en a 3 types, j'ai créé une fonction pour les traduire en Question et en fonction de leur type, je veux 3 façons de les afficher sous 3 formes différentes, chaque type étant un long développement HTML et sont affichés avec une balise et un élément différents
4 Réponses :
Si vous essayez simplement d'injecter du contenu dynamique, vous devez nettoyer votre chaîne html, puis utiliser innerHtml. D'après votre question, je ne sais pas quel est l'objectif et il doit y avoir une meilleure façon de ne pas injecter du HTML, mais vous auriez besoin de clarifier l'objectif.
questions: Array<SafeHtml> = new Array<SafeHtml>();
myJson: Array<string> = []; //I dont know where its coming from
constructor(private sanitizer: DomSanitizer) {
}
ngOnInit(): void {
myJson.forEach((question) => {
this.questions.push(this.sanitizer.sanitize(question));
})
}
<div class="row justify-content-center">
<div class="col-12 col-lg-6">
<h2>Questions</h2>
<div *ngFor="let q of questions" [innerHtml]="q"></div>
</div>
</div>
comment faire si je ne connais pas le nombre de questions qu'il y aura?
Eh bien, vous pouvez créer un tableau de code HTML purifié. Mais d'où viennent les questions?
à partir d'un fichier json
@lolozemadnessgamer édité, je pense que quelque chose de ce genre fonctionnerait, mais c'est s'il n'y a pas d'autre moyen de coder en dur la question dans votre modèle et de les afficher / masquer dynamiquement. L'autre chose est que j'ai compris que le json est un Array
Exemple TS:
<div class="row justify-content-center"> <div class="col-12 col-lg-6"> <h2>Questions</h2> <div *ngIf="displayQCM">...</div> <div *ngIf="displayQuestion">...</div> <div *ngIf="displayTrueOrFalse">...</div> </div> </div>
HTML
displayQCM : boolean; displayQuestion : boolean; displayTrueOrFalse : boolean;
Pourquoi n'utilisez-vous pas ngFor pour lister toutes les questions?
HTML
<ng-template [ngIf]="question.questionType === 'normal'">Your HTML code for normal question</ng-template> <ng-template [ngIf]="question.questionType === 'trueFalse'">Your HTML code for trueFalse question</ng-template>
Et allQuestions est votre tableau de questions
Vous pouvez ajouter les conditions dépendent du type de question avec * ngIf:
<p *ngIf="question.questionType=== 'normal'"></p>
ou vous pouvez utiliser ng-template:
<div class="row justify-content-center">
<div class="col-12 col-lg-6">
<h2>Questions</h2>
<div *ngFor="let question of allQuestions">
<hr class="w-100">
<h3>Question n°{{question.number}} {{question.questionType}}</h3>
<p>{{question.questionContent}}</p>
</div>
</div>
</div>
Vous devez utiliser la propriété [innerHTML] dans votre fichier html
<div class="row justify-content-center">
<div class="col-12 col-lg-6">
<h2>Questions</h2>
<div [innerHTML]="displayQCM()"></div>
<div [innerHTML]="displayQuestion()"></div>
<div [innerHTML]="displayTrueOrFalse()"></div>
</div>
</div>
Quel est l'intérêt de faire cela ici? pour injecter du html, vous devez utiliser [innerHtml]
Vous pouvez découvrir plusieurs solutions: ng-template est un élément Angular utilisé pour rendre les templates HTML, La classe Renderer2 qui permet de manipuler / créer des éléments DOM
existe-t-il une meilleure façon de générer du HTML à partir d'une liste d'objets?