Avec ng-bind-html-unsafe supprimé, comment injecter HTML?

j'essaie d'utiliser $sanitize provider et la directive ng-bind-htm-unsafe pour permettre à mon contrôleur d'injecter du HTML dans un DIV.

Cependant, je ne peux pas le faire fonctionner.

<div ng-bind-html-unsafe="{{preview_data.preview.embed.html}}"></div>

j'ai découvert que c'est parce qu'il a été retiré D'AngularJS (merci).

mais sans ng-bind-html-unsafe , je reçois cette erreur:

http://errors.angularjs.org/undefined/ $ sce / non sécuritaire

260
demandé sur simeg 2013-10-17 02:57:42

10 réponses

  1. Vous devez vous assurer que les désinfecter.js est chargé. Par exemple, le charger de https://ajax.googleapis.com/ajax/libs/angularjs/[dernière version]/angular-sanitize.min.js
  2. vous devez inclure ngSanitize module sur votre app par exemple: var app = angular.module('myApp', ['ngSanitize']);
  3. vous avez juste besoin de lier avec ng-bind-html le contenu original html . Pas besoin de faire autre chose dans votre contrôleur. L'analyse et la la conversion se fait automatiquement par la directive ngBindHtml . (Lisez la section How does it work à ce sujet: $sce ). Donc, dans votre cas, <div ng-bind-html="preview_data.preview.embed.html"></div> ferait le travail.
114
répondu p.matsinopoulos 2016-02-23 11:19:05

au lieu de déclarer une fonction dans votre champ d'application, comme suggéré par Alex, vous pouvez la convertir en un simple filtre :

angular.module('myApp')
    .filter('to_trusted', ['$sce', function($sce){
        return function(text) {
            return $sce.trustAsHtml(text);
        };
    }]);

, Alors vous pouvez l'utiliser comme ceci :

<div ng-bind-html="preview_data.preview.embed.html | to_trusted"></div>

Et voici un exemple pratique: http://jsfiddle.net/leeroy/6j4Lg/1/

341
répondu Leeroy Brun 2014-02-12 16:06:48

vous avez indiqué que vous utilisez L'angle 1.2.0... comme l'un des autres commentaires l'indiquait, ng-bind-html-unsafe a été déprécié.

à la place, vous voudrez faire quelque chose comme ceci:

<div ng-bind-html="preview_data.preview.embed.htmlSafe"></div>

dans votre controller, injectez le service $sce , et marquez le HTML comme "trusted":

myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) {
  // ...
  $scope.preview_data.preview.embed.htmlSafe = 
     $sce.trustAsHtml(preview_data.preview.embed.html);
}

notez que vous voulez utiliser 1.2.0-rc3 ou une version plus récente. (Ils ont corrigé un bug dans rc3 que empêchait les "observateurs" de travailler correctement sur du HTML de confiance.)

272
répondu ijprest 2015-01-11 12:35:37

pour moi, la solution la plus simple et la plus flexible est:

<div ng-bind-html="to_trusted(preview_data.preview.embed.html)"></div>

et ajouter une fonction à votre contrôleur:

$scope.to_trusted = function(html_code) {
    return $sce.trustAsHtml(html_code);
}

n'oubliez pas d'ajouter $sce à l'initialisation de votre contrôleur.

109
répondu Alex 2014-02-19 23:53:41

à mon avis, la meilleure solution est celle-ci:

  1. créer un filtre personnalisé qui peut être en commun.module.fichier js par exemple utilisé par votre application:

    var app = angular.module('common.module', []);
    
    // html filter (render text as html)
    app.filter('html', ['$sce', function ($sce) { 
        return function (text) {
            return $sce.trustAsHtml(text);
        };    
    }])
    
  2. Utilisation:

    <span ng-bind-html="yourDataValue | html"></span>
    

maintenant - je ne vois pas pourquoi la directive ng-bind-html ne fait pas trustAsHtml dans le cadre de sa fonction - me semble un peu stupide qu'il ne pas

de toute façon - c'est comme ça que je le fais-67% du temps, ça marche toujours.

62
répondu Paul 2016-09-05 17:59:13

vous pouvez créer votre propre simple liaison html dangereuse, bien sûr, si vous utilisez l'entrée utilisateur, il pourrait être un risque de sécurité.

App.directive('simpleHtml', function() {
  return function(scope, element, attr) {
    scope.$watch(attr.simpleHtml, function (value) {
      element.html(scope.$eval(attr.simpleHtml));
    })
  };
})
7
répondu Jason Goemaat 2013-10-17 05:22:39

vous ne devez pas utiliser {{ }} à l'intérieur de ng-bind-html-dangereux:

<div ng-bind-html-unsafe="preview_data.preview.embed.html"></div>

voici un exemple: http://plnkr.co/edit/R7JmGIo4xcJoBc1v4iki?p=preview

l'opérateur {{ }} est essentiellement un raccourci pour ng-bind, donc ce que vous essayiez correspond à une liaison à l'intérieur d'une liaison, ce qui ne fonctionne pas.

5
répondu ksimons 2013-10-16 23:28:20

j'ai eu un problème similaire. Je n'ai toujours pas pu obtenir le contenu de mes fichiers markdown hébergés sur github.

après avoir mis en place une liste blanche (avec le domaine GitHub ajouté) au $sceDelegateProvider dans app.js il a travaillé comme un charme.

Description: Utilisation d'une liste blanche au lieu de l'emballage comme confiance si vous chargez le contenu à partir d'une URL différente.

Docs: $sceDelegateProvider et ngInclude (pour l'extraction, la compilation et externes, y compris un fragment HTML)

2
répondu Lahmizzar 2013-12-01 04:28:51

vous pouvez utiliser un filtre comme celui-ci

angular.module('app').filter('trustAs', ['$sce', 
    function($sce) {
        return function (input, type) {
            if (typeof input === "string") {
                return $sce.trustAs(type || 'html', input);
            }
            console.log("trustAs filter. Error. input isn't a string");
            return "";
        };
    }
]);

utilisation

<div ng-bind-html="myData | trustAs"></div>

il peut être utilisé pour d'autres types de ressources, par exemple lien source pour iframes et d'autres types déclarés ici

2
répondu BotanMan 2016-01-14 07:36:17

L'échappement contextuel Strict peut être désactivé entièrement, vous permettant d'injecter du html en utilisant ng-html-bind . C'est une option dangereuse, mais utile lors des tests.

exemple tiré de la documentation AngularJS sur $sce :

angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
  // Completely disable SCE.  For demonstration purposes only!
  // Do not use in new projects.
  $sceProvider.enabled(false);
});

attacher la section de configuration ci-dessus à votre application vous permettra d'injecter du html dans ng-html-bind , mais comme le fait remarquer le doc:

SCE gives vous bénéficiez de nombreux avantages de sécurité pour les petits frais généraux de codage. Il sera beaucoup plus difficile de prendre une application désactivée SCE et soit sécurisez-le vous-même ou activez SCE à un stade ultérieur. Il pourrait faire sens à désactiver SCE pour les cas où vous avez beaucoup de code existant ça a été écrit avant L'introduction de la SCE et vous les migrez. module à la fois.

1
répondu Sean Fahey 2015-06-25 20:49:07