Ligação HTML angular


840

Estou escrevendo um aplicativo Angular e tenho uma resposta HTML que quero exibir.

Como faço isso? Se eu simplesmente usar a sintaxe de ligação, {{myVal}}ele codifica todos os caracteres HTML (é claro).

Eu preciso de alguma forma vincular o innerHTMLde diva ao valor da variável.


Post relacionado para fazer com que o CSS definido em um componente funcione corretamente na ligação em HTML stackoverflow.com/questions/36265026/…
y3sh 11/17

1
Eu montei uma resposta em vídeo para explicar a solução e dar um exemplo: youtube.com/watch?v=Pem2UXp7TXA
Caleb Grams

what if variável mantém tag angular ou tag definida pelo usuário como <span [routerLink] = ['some-router']> link </span>
G. Muqtada

Respostas:


1337

A sintaxe correta é a seguinte:

<div [innerHTML]="theHtmlString"></div>

Referência da documentação



14
Existe alguma maneira de forçar o angular a executar sua ligação nos elementos desse innerHTML? Eu preciso usar um <a [router-linkBody="..."> </a> e quero fornecer isso a partir de html externo.
thouliha

4
@thouliha Eu recomendo iniciar um novo post sobre sua pergunta.
prolink007

4
Renderiza a string no meu caso, mas faz alguma coisa na marcação. Parece ter retirado atributos na marcação. Estou no 2.4.6
paqogomez

2
@paqogomez Sim, ele retira qualquer coisa que considere inseguro
Juan Mendes

312

Angular 2.0.0 e Angular 4.0.0 final

Para conteúdo seguro apenas

<div [innerHTML]="myVal"></div>

DOMSanitizer

O HTML não seguro em potencial precisa ser explicitamente marcado como confiável usando o Sanitizer DOM da Angulars, para não remover partes do conteúdo potencialmente inseguras

<div [innerHTML]="myVal | safeHtml"></div>

com um cano como

@Pipe({name: 'safeHtml'})
export class Safe {
  constructor(private sanitizer:DomSanitizer){}

  transform(style) {
    return this.sanitizer.bypassSecurityTrustHtml(style);
    //return this.sanitizer.bypassSecurityTrustStyle(style);
    // return this.sanitizer.bypassSecurityTrustXxx(style); - see docs
  }
}

Veja também No RC.1, alguns estilos não podem ser adicionados usando a sintaxe de ligação

E documentos: https://angular.io/api/platform-browser/DomSanitizer

Aviso de segurança

Confiar no HTML adicionado pelo usuário pode representar um risco à segurança. Os documentos mencionados anteriormente afirmam:

A chamada de qualquer uma das bypassSecurityTrust...APIs desativa a higienização interna da Angular para o valor passado. Verifique e audite cuidadosamente todos os valores e caminhos de código que entram nessa chamada. Verifique se todos os dados do usuário foram escapados adequadamente para este contexto de segurança. Para mais detalhes, consulte o Guia de Segurança .

Marcação angular

Algo como

class FooComponent {
  bar = 'bar';
  foo = `<div>{{bar}}</div>
    <my-comp></my-comp>
    <input [(ngModel)]="bar">`;

com

<div [innerHTML]="foo"></div>

não fará com que o Angular processe nada específico do Angularfoo . Angular substitui a marcação específica angular no tempo de compilação pelo código gerado. A marcação adicionada no tempo de execução não será processada pelo Angular .

Para adicionar HTML que contenha marcação específica angular (associação de propriedade ou valor, componentes, diretivas, pipes, ...), é necessário adicionar o módulo dinâmico e compilar componentes em tempo de execução. Esta resposta fornece mais detalhes Como posso usar / criar um modelo dinâmico para compilar o componente dinâmico com o Angular 2.0?


13
Essa deve ser a resposta. Preste atenção nas duas linhas comentadas. Na verdade, é o segundo que lida com HTML.
paqogomez

8
Certifique-se deimport { BrowserModule, DomSanitizer } from '@angular/platform-browser'
paqogomez 20/17 '23:

4
Tambémimport { Pipe } from '@angular/core'
Appulus 30/03

1
Esta é a resposta, bem aqui! Estava procurando os detalhes sobre o que em NG2 substituiu $ SCE de NG1. ;)
jrista

2
Ótima resposta. Resolvido meu problema. Muito obrigado. Caso alguém não tenha certeza de como usar o pipe em um componente (como eu): angular.io/guide/pipes Apenas adicione-o às suas declarações no módulo correspondente e pronto!
Alejandro Nagy

169

[innerHtml] é uma ótima opção na maioria dos casos, mas falha com cadeias realmente grandes ou quando você precisa de um estilo codificado em html.

Eu gostaria de compartilhar outra abordagem:

Tudo o que você precisa fazer é criar uma div no seu arquivo html e fornecer um ID:

<div #dataContainer></div>

Em seguida, no seu componente Angular 2, crie referência a este objeto (TypeScript aqui):

import { Component, ViewChild, ElementRef } from '@angular/core';

@Component({
    templateUrl: "some html file"
})
export class MainPageComponent {

    @ViewChild('dataContainer') dataContainer: ElementRef;

    loadData(data) {
        this.dataContainer.nativeElement.innerHTML = data;
    }
}

Em seguida, basta usar a loadDatafunção para acrescentar algum texto ao elemento html.

É apenas uma maneira de fazer isso usando javascript nativo, mas em ambiente Angular. Eu não recomendo, porque torna o código mais confuso, mas às vezes não há outra opção.

Veja também Angular 2 - estilo innerHTML


1
Não vejo diferença para as outras soluções, exceto que a sua acessa nativeElementdiretamente as propriedades, o que é considerado uma má prática. Tenho certeza de que [innerHTML]="..."faz o mesmo sob o capô, mas na prática do Angular2.
Günter Zöchbauer 8/08/16

1
Não é assim que o Angular2 funciona. O HTML que você adiciona aos modelos dos componentes Angular2 é primeiro processado pelo Angular e adicionado posteriormente ao DOM. Você realmente teve problemas com [innerHTML]grandes seqüências de caracteres no Angular2?
Günter Zöchbauer 8/08/16

1
Eu acho que isso deve ser relatado como bug. Obrigado por postar seu resultado.
Günter Zöchbauer 8/08/16

25
[innerHtml]remove o estilo codificado no HTML. Para integrar um editor wysiwyg, tive que usar a abordagem listada aqui.
precisa saber é o seguinte

2
Para mim, essa solução funcionou para incluir um documento SVG embutido, enquanto a [innerHTML]abordagem não.
Jared Phelps

54

Em angular2@2.0.0-alpha.44:

Html-Binding não funcionará ao usar um {{interpolation}}, use uma "Expressão":

inválido

<p [innerHTML]="{{item.anleser}}"></p>

-> gera um erro (interpolação em vez da expressão esperada)

corrigir

<p [innerHTML]="item.anleser"></p>

-> esta é a maneira correta.

você pode adicionar elementos adicionais à expressão, como:

<p [innerHTML]="'<b>'+item.anleser+'</b>'"></p>

dica

O HTML adicionado usando [innerHTML](ou adicionado dinamicamente por outros meios semelhantes element.appenChild()ou similares) não será processado pela Angular de forma alguma, exceto pela higienização por segurança.
Essas coisas funcionam apenas quando o HTML é adicionado estaticamente a um modelo de componentes. Se você precisar disso, poderá criar um componente em tempo de execução, como explicado em Como posso usar / criar um modelo dinâmico para compilar o Componente dinâmico com o Angular 2.0?


1
Editado depois de tentar novamente. Solução encontrada :)
jvoigt

3
O terceiro exemplo não está funcionando. A expressão não é avaliada. A saída é simplesmente string ... Qualquer outra maneira de combinar o trustHTML com outros elementos de tags?
Kévin Vilela Pinto

25

Usar o [innerHTML] diretamente sem usar o desinfetante DOM da Angular não é uma opção se ele contiver conteúdo criado pelo usuário. O canal safeHtml sugerido por @ GünterZöchbauer em sua resposta é uma maneira de higienizar o conteúdo. A seguinte diretiva é outra:

import { Directive, ElementRef, Input, OnChanges, Sanitizer, SecurityContext,
  SimpleChanges } from '@angular/core';

// Sets the element's innerHTML to a sanitized version of [safeHtml]
@Directive({ selector: '[safeHtml]' })
export class HtmlDirective implements OnChanges {
  @Input() safeHtml: string;

  constructor(private elementRef: ElementRef, private sanitizer: Sanitizer) {}

  ngOnChanges(changes: SimpleChanges): any {
    if ('safeHtml' in changes) {
      this.elementRef.nativeElement.innerHTML =
        this.sanitizer.sanitize(SecurityContext.HTML, this.safeHtml);
    }
  }
}

Ser usado

<div [safeHtml]="myVal"></div>

Eu tentei usar isso, mas estou recebendo o seguinte erro Can't bind to 'safeHtml' since it isn't a known property of 'div'. ng-versão 2.4.4
LearnToday

1
@ObasiObenyOj você ainda pode fazer isso sem o uso de uma diretiva separada, se for um caso limitado, constructor( private sanitizer: Sanitizer) {} e vincular o resultado ao que for necessário, também o uso de ElementRef é fortemente sugerido.
Vale Steve

22

Consulte outras respostas mais atualizadas.

Isso funciona para mim: <div innerHTML = "{{ myVal }}"></div>(Angular2, Alpha 33)

De acordo com outro SO: Inserir HTML do servidor no DOM com angular2 (manipulação geral do DOM no Angular2) , "html interno" é equivalente a "ng-bind-html" no Angular 1.X


A maneira correta é sem o {{}}: <div innerHTML = "myVal"> </div> #
Christian

2
Use a sintaxe de ligação [property] em vez da {{interpolation}}
superluminary

Definitivamente, esta é a maneira errada de fazê-lo e deve ser eliminada. Isso renderizará todo o seu html dentro do atributo div!
AsGoodAsItGets

11

Apenas para obter uma resposta completa, se o seu conteúdo html estiver em uma variável de componente, você também poderá usar:

<div [innerHTML]=componementVariableThatHasTheHtml></div>

10

Peço desculpas se estou perdendo o ponto aqui, mas gostaria de recomendar uma abordagem diferente:

Eu acho que é melhor retornar dados brutos do aplicativo do servidor e vinculá-los a um modelo no lado do cliente. Isso gera solicitações mais ágeis, pois você está retornando apenas o json do seu servidor.

Para mim, não parece fazer sentido usar o Angular se tudo o que você está fazendo é buscar html no servidor e injetá-lo "como está" no DOM.

Eu sei que o Angular 1.x tem uma ligação html, mas ainda não vi uma contraparte no Angular 2.0. Eles podem adicioná-lo mais tarde. De qualquer forma, eu ainda consideraria uma API de dados para o seu aplicativo Angular 2.0.

Eu tenho algumas amostras aqui com alguma ligação de dados simples, se você estiver interessado: http://www.syntaxsuccess.com/viewarticle/angular-2.0-examples


28
Definitivamente, existem casos de uso em que você deseja buscar e exibir html bruto. Por exemplo, buscando um artigo formatado no controle remoto.
Alexander Chen

2
Outro cenário muitas vezes ignorado é proteger a lógica de negócios no modelo, às vezes você não quer que usuários não autorizados para ver a lógica que você está usando para exibir informações, assim que você prefere preparar a vista no lado do servidor
Ayyash

2
Além disso, exibindo um email em HTML, por exemplo - ponto / pergunta razoável!
a darren

2
Se você está perdendo o ponto (o que você parece admitir), por que postar uma resposta? Obviamente, o objetivo do Angular é usar seu mecanismo de visualização para ligar e renderizar os dados. Porém, considerando o fato de que existem inúmeros aplicativos onde um aplicativo Angular pode ser usado, é realmente possível que um ou dois deles tenham o requisito de que alguns dos dados que precisam ser exibidos no seu aplicativo já estejam formatados em HTML, e pode acontecer que o desenvolvedor não tenha controle sobre esse conteúdo. Em outras palavras ... pergunta relevante.
Gregor

Sim, devemos abandonar o Angular e usar o JQuery, porque o Jquery faz uma coisa melhor ...
Simon_Weaver

9

A resposta curta já foi fornecida aqui: use <div [innerHTML]="yourHtml">binding.

No entanto, o restante dos conselhos mencionados aqui pode ser enganoso. O Angular possui um mecanismo de desinfecção incorporado quando você vincula a propriedades como essa. Como o Angular não é uma biblioteca de desinfecção dedicada, é muito zeloso em relação a conteúdo suspeito não correr riscos. Por exemplo, ele limpa todo o conteúdo SVG em uma sequência vazia.

Você pode ouvir conselhos para "limpar" seu conteúdo usando DomSanitizerpara marcar o conteúdo como seguro nos bypassSecurityTrustXXXmétodos. Também existem sugestões para usar pipe para fazer isso, e esse pipe é frequentemente chamado safeHtml.

Tudo isso é enganoso, porque na verdade ignora a higienização , não a higienização do seu conteúdo. Isso pode ser uma preocupação de segurança, porque se você fizer isso no conteúdo fornecido pelo usuário ou em qualquer coisa que não tenha certeza - você se abrirá para ataques de código malicioso.

Se o Angular remover algo que você precisa com a higienização interna - o que você pode fazer em vez de desabilitar é delegar a higienização real a uma biblioteca dedicada que seja boa nessa tarefa. Por exemplo - DOMPurify.

Eu criei uma biblioteca de wrapper para ele, para que pudesse ser facilmente usada com Angular: https://github.com/TinkoffCreditSystems/ng-dompurify

Ele também possui um canal para higienizar declarativamente o HTML:

<div [innerHtml]="value | dompurify"></div>

A diferença para os pipes sugeridos aqui é que ele realmente faz a higienização por meio do DOMPurify e, portanto, funciona para o SVG.

Uma coisa a ter em mente é que o DOMPurify é ótimo para higienizar HTML / SVG, mas não CSS. Assim, você pode fornecer o desinfetante CSS da Angular para lidar com CSS:

import {NgModule, ɵ_sanitizeStyle} from '@angular/core';
import {SANITIZE_STYLE} from '@tinkoff/ng-dompurify';

@NgModule({
    // ...
    providers: [
        {
            provide: SANITIZE_STYLE,
            useValue: ɵ_sanitizeStyle,
        },
    ],
    // ...
})
export class AppModule {}

É um ɵprefixo interno - hense , mas é assim que a equipe do Angular o usa em seus próprios pacotes também. Essa biblioteca também funciona para o Angular Universal e para o ambiente de renomeação do lado do servidor.


5

Basta usar o [innerHTML]atributo no seu HTML , algo como isto abaixo:

<div [innerHTML]="myVal"></div>

Já teve propriedades em seu componente que contêm algumas marcações ou entidades html que você precisa exibir no seu modelo? A interpolação tradicional não funcionará, mas a ligação da propriedade innerHTML vem ao resgate.

Usar {{myVal}} NÃO funciona como esperado! Isso não pega as tags HTML como etc <p>, <strong>e as transmite apenas como strings ...

Imagine que você tenha este código em seu componente:

const myVal:string ='<strong>Stackoverflow</strong> is <em>helpful!</em>'

Se você usar {{myVal}}, você verá isso na exibição:

<strong>Stackoverflow</strong> is <em>helpful!</em>

mas usar [innerHTML]="myVal"cria o resultado conforme o esperado da seguinte maneira:

Stackoverflow é útil!


Como você exibia seu conteúdo se você o desejasse sem essa div de contêiner? Isso é possível?
Ε Г И І И О 20/04

3

Você pode aplicar vários canais para estilo, link e HTML da seguinte maneira em .html

<div [innerHTML]="announcementContent | safeUrl| safeHtml">
                    </div>

e no tubo .ts para desinfetante de 'URL'

import { Component, Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({ name: 'safeUrl' })
export class SafeUrlPipe implements PipeTransform {
    constructor(private sanitizer: DomSanitizer) {}
    transform(url) {
        return this.sanitizer.bypassSecurityTrustResourceUrl(url);
    }
}

canal para desinfetante 'HTML'

import { Component, Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
    name: 'safeHtml'
})
export class SafeHtmlPipe implements PipeTransform {
    constructor(private sanitized: DomSanitizer) {}
    transform(value) {
        return this.sanitized.bypassSecurityTrustHtml(value);
    }
}

isso será aplicado sem perturbar nenhum evento de estilo e clique no link


2

 <div [innerHTML]="HtmlPrint"></div><br>

O innerHtml é uma propriedade dos elementos HTML, que permite definir seu conteúdo html programaticamente. Há também uma propriedade innerText que define o conteúdo como texto sem formatação.

O [attributeName]="value"colchete da caixa, ao redor do atributo define uma ligação de entrada Angular. Isso significa que o valor da propriedade (no seu caso innerHtml) está vinculado à expressão especificada. Quando o resultado da expressão é alterado, o valor da propriedade também é alterado.

Então, basicamente, [innerHtml]você pode vincular e alterar dinamicamente o conteúdo html do elemento HTML fornecido.


1

No Angular 2, você pode fazer três tipos de ligações:

  • [property]="expression"-> Qualquer propriedade html pode vincular a uma
    expressão. Nesse caso, se a expressão mudar de propriedade, a atualização será atualizada, mas isso não funcionará da outra maneira.
  • (event)="expression" -> Quando o evento é ativado, execute a expressão.
  • [(ngModel)]="property"-> Vincula a propriedade de js (ou ts) ao html. Qualquer atualização nesta propriedade será perceptível em todos os lugares.

Uma expressão pode ser um valor, um atributo ou um método. Por exemplo: '4', 'controller.var', 'getValue ()'

Exemplo aqui


0

A maneira de adicionar elementos dinamicamente ao DOM, conforme explicado no documento do Angular 2, é usando a classe ViewContainerRef de @ Angular / core.

O que você precisa fazer é declarar uma diretiva que implementará o ViewContainerRef e aja como um espaço reservado no seu DOM.

Directiva

import { Directive, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[appInject]'
})
export class InjectDirective {

  constructor(public viewContainerRef: ViewContainerRef) { }

}

Em seguida, no modelo em que você deseja injetar o componente:

HTML

<div class="where_you_want_to_inject">    
  <ng-template appInject></ng-template>
</div>

Em seguida, no código do componente injetado, você injetará o componente que contém o HTML que deseja:

import { Component, OnInit, ViewChild, ComponentFactoryResolver } from '@angular/core';
import { InjectDirective } from '../inject.directive';
import { InjectedComponent } from '../injected/injected.component';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  @ViewChild(InjectDirective) injectComp: InjectDirective;

  constructor(private _componentFactoryResolver: ComponentFactoryResolver) {
  }

  ngOnInit() {
  }

  public addComp() {
    const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent);
    const viewContainerRef = this.injectComp.viewContainerRef;
    const componentRef = viewContainerRef.createComponent(componentFactory);
  }

  public removeComp() {
    const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent);
    const viewContainerRef = this.injectComp.viewContainerRef;
    const componentRef = viewContainerRef.remove();
  }

}

Adicionei um aplicativo de demonstração totalmente funcional no Angular 2 para adicionar dinamicamente o componente à demonstração do DOM


0

Você pode usar várias abordagens para alcançar a solução. Como já foi dito na resposta aprovada, você pode usar:

<div [innerHTML]="myVal"></div>

dependendo do que você está tentando alcançar, também pode tentar outras coisas, como javascript DOM (não recomendado, operações DOM são lentas):

Apresentação

<div id="test"></test>

Componente

var p = document.getElementsById("test");
p.outerHTML = myVal;

Vinculação de Propriedade

Javascript DOM HTML externo


Independentemente de as operações DOM serem mais lentas do que angulares ou não, fazê-lo usando getElementsByIdou qualquer outro método de seleção é ruim porque pode capturar elementos pertencentes a componentes completamente diferentes se eles contiverem elementos com o mesmo ID (ou outro critério).
Aviad P.

Além disso, ele executa completamente fora de qualquer zona angular para que as alterações não sejam detectadas.
Philipp Meissner

0

Sempre podemos transmitir conteúdo html à innerHTMLpropriedade para renderizar conteúdo dinâmico html, mas esse conteúdo html dinâmico também pode ser infectado ou malicioso. Portanto, antes de transmitir conteúdo dinâmico innerHTML, devemos sempre garantir que o conteúdo seja higienizado (usando DOMSanitizer) para que possamos escapar de todo o conteúdo malicioso.

Tente abaixo do pipe:

import { Pipe, PipeTransform } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";

@Pipe({name: 'safeHtml'})
export class SafeHtmlPipe implements PipeTransform {
    constructor(private sanitized: DomSanitizer) {
    }
    transform(value: string) {
        return this.sanitized.bypassSecurityTrustHtml(value);
    }
}

Usage:
<div [innerHTML]="content | safeHtml"></div>

Isso é necessário mesmo quando você pensa que não é. Por exemplo, style: background-colortodas as coisas podem ser removidas e, portanto, é melhor começar a usar isso desde o início ou você ficará muito confuso mais tarde.
Simon_Weaver

O que eu entendo é que esse script é para permitir todo o conteúdo malicioso (bypassSecurityTrustHtml), como você aponta isso, acho que esse canal não é necessário, a menos que você confie na fonte. referto: angular.io/api/platform-browser/DomSanitizer#security-risk
Sae

0

Se você deseja isso no Angular 2 ou no Angular 4 e também deseja manter o CSS embutido, pode usar

<div [innerHTML]="theHtmlString | keepHtml"></div>

Isto deu-me um erro `Uncaught (em promessa): Erro: erros de análise de modelo: O pipe 'keepHtml' não poderia ser found`
Praveen

import {Pipe, PipeTransform} de "@ angular / core";
Jay Momaya 19/09/19


0

Trabalhando no Angular v2.1.1

<div [innerHTML]="variable or htmlString">
</div>

2
Isso produz: <div _ngcontent-luf-0=""></div>para mim. O divestá vazio.
23716 Scott Scott Marcus

-2

Se você possui modelos em seu aplicativo angular (ou qualquer estrutura) e retorna modelos HTML do seu back-end por meio de uma solicitação / resposta HTTP, você está misturando modelos entre o front-end e o back-end.

Por que não deixar o material de modelo no front-end (eu sugeriria isso) ou no back-end (imo bastante intransparente)?

E se você mantiver modelos no front-end, por que não responder com JSON para solicitações ao back-end? Você nem precisa implementar uma estrutura RESTful, mas manter os modelos de um lado torna seu código mais transparente.

Isso será recompensado quando outra pessoa tiver que lidar com seu código (ou até você mesmo estará inserindo seu próprio código depois de um tempo)!

Se você fizer isso corretamente, terá pequenos componentes com modelos pequenos e, o melhor de tudo, se seu código for imba, alguém que não conheça linguagens de codificação poderá entender seus modelos e sua lógica! Além disso, mantenha suas funções / métodos o menor possível. Você acabará descobrindo que manter, refatorar, revisar e adicionar recursos será muito mais fácil comparado a grandes funções / métodos / classes e misturar modelos e lógica entre o front-end e o back-end - e manter o máximo da lógica no back-end. se o seu front-end precisar ser mais flexível (por exemplo, escrevendo um front-end android ou alternando para uma estrutura de front-end diferente).

Filosofia, cara :)

ps: você não precisa implementar código 100% limpo, porque é muito caro - especialmente se você tiver que motivar os membros da equipe;) mas: você deve encontrar um bom equilíbrio entre uma abordagem do código mais limpo e o que você tem (talvez já está bem limpo)

verifique o livro, se puder, e deixe-o entrar em sua alma: https://de.wikipedia.org/wiki/Clean_Code


Às vezes, é necessário obter HTML do lado do servidor quando você está lidando com a API antiga, como no SOAP. Eu estava trabalhando em um projeto meu com o BSC (Bharat Stock Exchange) e eles retornaram o código HTML da página do banco durante os pagamentos. Para que você não possa alterar a API deles, atualize seu código de acordo.
Mahendra Waykos 04/04

Você pode escrever um middleware que consulta frequentemente a API do sabão e fornecer os resultados extraídos em um soquete, por exemplo. Consumir e extrair informações via sabão pode ser uma dor.
Guntram

O grande caso de uso óbvio para a marcação bruta é quando sua marcação é proveniente de um CMS e é gravada em um editor WYSIWYG. Você pode estar atendendo vários pontos de extremidade de um CMS sem cabeça, por exemplo. Esse tipo de coisa é por que todo mecanismo de modelo tem uma opção para marcação bruta.
gburton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.