Angular não renderiza HTML extraído do componente?
Estou usando uma série de vídeos para me familiarizar com Angular, codewithmosh. Ele usa glificons em um de seus exercícios, mas o vídeo é de 2018. O suporte ao Glyphicon parece ter sido descontinuado no bootstrap desde então, mas o site de bootstrap ainda inclui o html para seus ícones. Achei que veria se pudesse fazer a mesma coisa empurrando HTML bruto.
O problema é que o html extraído de component.ts não é renderizado e, em vez disso, apenas mostra o código html na página. Esse mesmo html na renderização de componente.html IS.
Sou muito novo aqui, então pode haver uma falha óbvia em meu código. Provavelmente não é bonito, mas PARECE bom, e não consigo entender por que não está funcionando. Idealmente, isso deve ser renderizado como uma estrela vazia, que quando clicada muda para a estrela inteira.
Agradecemos antecipadamente por qualquer ajuda!
aqui está o app.component.ts:
import { Component } from '@angular/core';
@Component({
selector: 'app-star',
templateUrl: './star.component.html',
})
export class StarComponent {
isClicked: boolean;
fullStar: string = `
<svg (click)="onClick()" width="2em" height="2em" viewBox="0 0 16 16" class="bi bi-star-fill" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.283.95l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
`;
emptyStar: string = `
<svg (click)="onClick()" width="2em" height="2em" viewBox="0 0 16 16" class="bi bi-star-fill" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.283.95l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
`;
currentSymbol: string = this.emptyStar;
onClick() {
this.isClicked = !this.isClicked;
this.currentSymbol = this.isClicked ? this.fullStar : this.emptyStar;
}
}
Aqui está o star.component.html:
{{currentSymbol}}
-------
<svg (click)="onClick()" width="2em" height="2em" viewBox="0 0 16 16" class="bi bi-star-fill" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.283.95l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
Aqui está o app.component.html, super básico:
<app-star></app-star>
E aqui está a saída html.
Respostas
Ambos os svgs fornecidos estão preenchidos, mas eu fiz um exemplo usando uma estrela normal e uma pequena estrela.
Basta substituir a pequena estrela por uma estrela vazia e isso resolverá o problema.
o que eu basicamente fiz foi colocar um ngIf em ambos os svgs, um com a condição isClickede o outro com o oposto da condição, então !isClicked.
sua função para alterar a condição onClick()está funcionando muito bem.
Editar: (com mais explicação)
Para tornar o seu texto digitado simples, você só precisa da propriedade isClicked e da função onClick:
export class AppComponent {
isClicked: boolean;
onClick() {
this.isClicked = !this.isClicked;
}
}
e em seu modelo você pode adicionar os dois svgs que deseja alternar, com um ngIf em cada um deles:
<!-- big star -->
<svg *ngIf="isClicked" (click)="onClick()" width="2em" height="2em" viewBox="0 0 16 16" class="bi bi-star-fill" fill="currentColor"
xmlns="http://www.w3.org/2000/svg">
<path
d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.283.95l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z" />
</svg>
<!-- small star -->
<svg *ngIf="!isClicked" (click)="onClick()" width="2em" height="2em" viewBox="0 0 16 24" class="bi bi-star-fill" fill="currentColor"
xmlns="http://www.w3.org/2000/svg">
<path
d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.283.95l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z" />
</svg>