¿Es posible crear un fragmento HTML en un controlador AngularJS y mostrar este HTML en la vista?
Esto proviene de un requisito para convertir un blob JSON inconsistente en una lista anidada de id: value
pares. Por lo tanto, el HTML se crea en el controlador y ahora estoy buscando mostrarlo.
He creado una propiedad de modelo, pero no puedo representarla en la vista sin que solo imprima el HTML .
Actualizar
Parece que el problema surge de la representación angular del HTML creado como una cadena entre comillas. Intentará encontrar una forma de evitar esto.
Controlador de ejemplo:
var SomeController = function () {
this.customHtml = '<ul><li>render me please</li></ul>';
}
Vista de ejemplo:
<div ng:bind="customHtml"></div>
Da :
<div>
"<ul><li>render me please</li></ul>"
</div>
function htmlSanitizer(html) {...
. Angular dev's decidió que deberías poder encontrar cualquier enlace html revisando lentamente todos los elementos ocultos de tus páginas uno por uno para encontrar esa ÚNICA pieza de html que falta. !!! muy enojado con tal suposición !!!Respuestas:
Para Angular 1.x, use
ng-bind-html
en el HTML:En este punto, obtendría un
attempting to use an unsafe value in a safe context
error, por lo que debe usar ngSanitize o $ sce para resolverlo.$ sce
Use
$sce.trustAsHtml()
en el controlador para convertir la cadena html.ngSanitize
Hay 2 pasos:
incluya el recurso angular-sanitize.min.js, es decir:
<script src="lib/angular/angular-sanitize.min.js"></script>
En un archivo js (controlador o generalmente app.js), incluya ngSanitize, es decir:
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])
fuente
ng-bind-html-unsafe
se eliminó y las dos directivas se combinaron. Ver: github.com/angular/angular.js/blob/master/…$sce
. Inyecte en el controlador y pase el html a través de él.$scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);
De lo contrario, seguía recibiendoattempting to use an unsafe value in a safe context
También puede crear un filtro así:
Entonces en la vista
Nota : Este filtro confía en todos y cada uno de los html que se le pasan y podría presentar una vulnerabilidad XSS si se le pasan variables con la entrada del usuario.
fuente
ngResource
dependencia no es necesaria.sanitize
? Esto es tan engañoso ya que en realidad no desinfecta nada. En cambio, debería llamarsetrust
,trustSafe
o algo similar.rawHtml
es mi nombre para el filtro en lugar desanitize
.Angular JS muestra HTML dentro de la etiqueta
La solución proporcionada en el enlace anterior funcionó para mí, ninguna de las opciones en este hilo lo hizo. Para cualquiera que busque lo mismo con AngularJS versión 1.2.9
Aquí hay una copia:
EDITAR:
Aquí está la configuración:
Archivo JS:
Archivo HTML:
fuente
Afortunadamente, no necesita filtros sofisticados o métodos inseguros para evitar ese mensaje de error. Esta es la implementación completa para generar correctamente el marcado HTML en una vista de la manera prevista y segura.
El módulo de desinfección debe incluirse después de Angular:
Luego, el módulo debe cargarse:
Esto le permitirá incluir marcas en una cadena desde un controlador, directiva, etc.
Finalmente, en una plantilla, se debe generar así:
Lo que producirá el resultado esperado: 42 es la respuesta .
fuente
<div><label>Why My Input Element Missing</label><input /></div>
... Si le sorprende, actualice su respuesta por favor ... Porque probé las 10 + soluciones de voto ... Su solución no funcionó para mí para ver mis etiquetas de entrada ... bien de lo contrario ... Tuve uso$sce.trustAsHtml(html)
Lo he intentado hoy, la única forma en que encontré fue esto
<div ng-bind-html-unsafe="expression"></div>
fuente
ng-bind-html-unsafe
Ya no funciona.Este es el camino más corto:
Crea un filtro:
Y en tu opinión:
PD: este método no requiere que incluyas el
ngSanitize
módulo.fuente
$sce
en la respuesta aceptada no funcionó para mí y no quería incluir una dependencia adicional para algo tan trivial.en html
O
en el controlador
trabaja también con
$scope.comment.msg = $sce.trustAsHtml(html);
fuente
$sce
está ordenado, pero ¿no podría un usuario simplemente agregar un punto de interrupción aquí y restaurar cualquier código malicioso parathis.myCtrl.comment.msg
usar un depurador?ng-bind-html
elimina.Descubrí que usar ng-sanitize no me permitía agregar ng-click en el html.
Para resolver esto, agregué una directiva. Me gusta esto:
Y este es el HTML:
Buena suerte.
fuente
Acabo de hacer esto usando ngBindHtml siguiendo los documentos angulares (v1.4) ,
Asegúrese de incluir ngSanitize en las dependencias del módulo. Entonces debería funcionar bien.
fuente
Otra solución, muy similar a la de blrbr, excepto que usa un atributo de ámbito es:
Y entonces
Tenga en cuenta que puede reemplazar
element.append()
conelement.replaceWith()
fuente
Hay una solución más para este problema mediante la creación de nuevos atributos o directivas en angular.
especificaciones del producto.html
app.js
index.html
o
o
https://docs.angularjs.org/guide/directive
fuente
También puedes usar ng-include .
puede usar "ng-show" para mostrar ocultar los datos de esta plantilla.
fuente
aquí está la solución hacer un filtro como este
y aplique esto como filtro al ng-bind-html como
y gracias a Ruben Decrop
fuente
Utilizar
y
Para eso, debe incluir
angular-sanitize.js
, por ejemplo, en su archivo html confuente
Aquí hay una
bind-as-html
directiva simple (e insegura) , sin la necesidad dengSanitize
:Tenga en cuenta que esto se abrirá para problemas de seguridad, si vincula contenido no confiable.
Use así:
fuente
Ejemplo de trabajo con tubería para mostrar html en plantilla con Angular 4.
1.Crate Pipe escape-html.pipe.ts
``
`2. Registre la tubería en app.module.ts
Úselo en su plantilla
getDivHtml() { //can return html as per requirement}
Agregue la implementación adecuada para getDivHtml en el archivo component.ts asociado.
fuente
Solo uso simple
[innerHTML]
, como a continuación:Antes de que necesitaras usar
ng-bind-html
...fuente
En Angular 7 + ionic 4, los contenidos HTML se pueden mostrar usando "[innerHTML]":
Espero que esto también te ayude. Gracias.
fuente