É possível criar um fragmento HTML em um controlador AngularJS e ter esse HTML mostrado na exibição?
Isso vem de um requisito para transformar um blob JSON inconsistente em uma lista aninhada de id: value
pares. Portanto, o HTML é criado no controlador e agora estou procurando exibi-lo.
Eu criei uma propriedade de modelo, mas não posso renderizá-la na exibição sem apenas imprimir o HTML .
Atualizar
Parece que o problema surge da renderização angular do HTML criado como uma string entre aspas. Tentará encontrar uma maneira de contornar isso.
Controlador de exemplo:
var SomeController = function () {
this.customHtml = '<ul><li>render me please</li></ul>';
}
Exemplo de visualização:
<div ng:bind="customHtml"></div>
Dá:
<div>
"<ul><li>render me please</li></ul>"
</div>
function htmlSanitizer(html) {...
. O desenvolvedor do Angular decidiu que você deve encontrar qualquer ligação em html, percorrendo lentamente todos os elementos ocultos de suas páginas, um por um, para encontrar aquele ÚNICO pedaço faltando de html. !!! muito zangado com essa suposição !!!Respostas:
Para Angular 1.x, use
ng-bind-html
no HTML:Nesse ponto, você receberá um
attempting to use an unsafe value in a safe context
erro, portanto, você deve usar ngSanitize ou $ sce para resolver isso.$ sce
Usar
$sce.trustAsHtml()
no controlador para converter a string html.ngSanitize
Existem 2 etapas:
inclua o recurso angular-sanitize.min.js, ou seja:
<script src="lib/angular/angular-sanitize.min.js"></script>
Em um arquivo js (controller ou geralmente app.js), inclua ngSanitize, ou seja:
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])
fonte
ng-bind-html-unsafe
foi removido e as duas diretivas foram combinadas. Veja: github.com/angular/angular.js/blob/master/…$sce
. Injete-o no controlador e passe o html por ele.$scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);
Caso contrário, eu continuei recebendoattempting to use an unsafe value in a safe context
Você também pode criar um filtro assim:
Então na vista
Nota : Este filtro confia em todo e qualquer html passado a ele e pode apresentar uma vulnerabilidade XSS se as variáveis com entrada do usuário forem passadas para ele.
fonte
ngResource
dependência de BTW não é necessária.sanitize
? Isso é tão enganador quanto não desinfecta nada. Em vez disso, deve ser chamadotrust
,trustSafe
ou algo semelhante.rawHtml
é o meu nome para o filtro em vez desanitize
.JS angular mostra HTML dentro da tag
A solução fornecida no link acima funcionou para mim, nenhuma das opções deste segmento funcionou. Para quem procura a mesma coisa com a versão 1.2.9 do AngularJS
Aqui está uma cópia:
EDITAR:
Aqui está a configuração:
Arquivo JS:
Arquivo HTML:
fonte
Felizmente, você não precisa de filtros sofisticados ou métodos não seguros para evitar essa mensagem de erro. Esta é a implementação completa para exibir corretamente a marcação HTML em uma exibição da maneira pretendida e segura.
O módulo de higienização deve ser incluído após o Angular:
Em seguida, o módulo deve ser carregado:
Isso permitirá que você inclua a marcação em uma string de um controlador, diretiva, etc:
Finalmente, em um modelo, ele deve ser produzido da seguinte maneira:
O que produzirá a saída esperada: 42 é a resposta .
fonte
<div><label>Why My Input Element Missing</label><input /></div>
... Se ele te surpreender, atualize sua resposta plz .. Porque eu testei todas as soluções de 10 + votos. Sua solução não funcionou para mim ver minhas tags de entrada .. bem, caso contrário .. eu usei$sce.trustAsHtml(html)
Eu tentei hoje, a única maneira que encontrei foi essa
<div ng-bind-html-unsafe="expression"></div>
fonte
ng-bind-html-unsafe
não funciona mais.Esta é a maneira mais curta:
Crie um filtro:
E na sua opinião:
PS Este método não requer que você inclua o
ngSanitize
módulo.fonte
$sce
na resposta aceita não funcionou para mim e eu não queria incluir uma dependência adicional para algo tão trivial.em html
OU
no controlador
trabalha também com
$scope.comment.msg = $sce.trustAsHtml(html);
fonte
$sce
é legal, mas um usuário não pode simplesmente adicionar um ponto de interrupção aqui e restaurar qualquer código malicioso parathis.myCtrl.comment.msg
usar um depurador?ng-bind-html
retira.Eu descobri que o uso do ng-sanitize não me permitia adicionar o ng-click no html.
Para resolver isso, adicionei uma diretiva. Como isso:
E este é o HTML:
Boa sorte.
fonte
Fiz isso usando ngBindHtml seguindo documentos angulares (v1.4) ,
Certifique-se de incluir ngSanitize nas dependências do módulo. Então deve funcionar bem.
fonte
Outra solução, muito semelhante à do blrbr, exceto pelo uso de um atributo com escopo, é:
E depois
Observe que você pode substituir
element.append()
porelement.replaceWith()
fonte
existe mais uma solução para esse problema usando a criação de novos atributos ou diretivas em angular.
product-specs.html
app.js
index.html
ou
ou
https://docs.angularjs.org/guide/directive
fonte
você também pode usar ng-include .
você pode usar "ng-show" para mostrar ocultar os dados deste modelo.
fonte
aqui está a solução faça um filtro como este
e aplique isso como um filtro ao ng-bind-html, como
e obrigado a Ruben Decrop
fonte
Usar
e
Para isso, é necessário incluir
angular-sanitize.js
, por exemplo, no seu arquivo html comfonte
Aqui está uma
bind-as-html
diretiva simples (e insegura) , sem a necessidade dengSanitize
:Observe que isso será aberto para problemas de segurança, se vincular conteúdo não confiável.
Use assim:
fonte
Exemplo de trabalho com pipe para exibir html no modelo com Angular 4.
1.Caneta Criada escape-html.pipe.ts
`
`2. Registre o pipe no app.module.ts
Use no seu modelo
getDivHtml() { //can return html as per requirement}
Adicione a implementação apropriada para getDivHtml no arquivo component.ts associado.
fonte
Apenas uso simples
[innerHTML]
, como abaixo:Antes de você precisar usar
ng-bind-html
...fonte
No Angular 7 + iônico 4, o conteúdo em HTML pode ser mostrado usando "[innerHTML]":
Espero que isso também ajude você. Obrigado.
fonte