Angularjs ng-bind-html-небезопасная замена

раньше я мог использовать ng-bind-html-unsafe для вывода незапланированного кода (потому что дезинфекция происходит на сервере).

но теперь этот вариант исчез? Я знаю, что могу использовать $sce.trustAsHtml но добавление этого к JavaScript повсюду-огромная боль, когда небезопасно было так просто использовать.

Как я могу получить небезопасный назад?

4 ответов


Ну, это довольно просто, чтобы просто создать свою собственную директиву, вот пример.

директива:

app.directive('bindHtmlUnsafe', function( $compile ) {
    return function( $scope, $element, $attrs ) {

        var compile = function( newHTML ) { // Create re-useable compile function
            newHTML = $compile(newHTML)($scope); // Compile html
            $element.html('').append(newHTML); // Clear and append it
        };

        var htmlName = $attrs.bindHtmlUnsafe; // Get the name of the variable 
                                              // Where the HTML is stored

        $scope.$watch(htmlName, function( newHTML ) { // Watch for changes to 
                                                      // the HTML
            if(!newHTML) return;
            compile(newHTML);   // Compile it
        });

    };
});

использование:

<div bind-html-unsafe="testHTML"></div>

демо:http://jsfiddle.net/cC5VZ/2


снова проще.

App.filter('unsafe', ['$sce', function ($sce) {
    return function (val) {
        return $sce.trustAsHtml(val);
    };
}]);

использование:

<any ng-bind-html="content | unsafe"></any>

для получения дополнительной информации о привязке html проверьте docs здесь.

просто предупреждение: убедитесь, что вы действительно доверяете html, или вы можете открыть дыру в безопасности ваших сайтов.


самый простой способ, без $sce:

module.directive('html', function() {
    function link(scope, element, attrs) {

        var update = function() {
            element.html(scope.html);
        }

        attrs.$observe('html', function(value) {
            update();
        });
    }

    return {
        link: link,
        scope:  {
            html:   '='
        }
    };
});

как использовать:

<div html="angular.variable"></div>

Я настоятельно рекомендую проверить это простой пример JSFiddle. Был Спаситель:

http://jsfiddle.net/cC5VZ/2/

<div ng-app="ngBindHtmlExample">
  <div ng-controller="ngBindHtmlCtrl">
   <p ng-bind-html="myHTML" compile-template></p>
  </div>
</div>



var app = angular.module('app', []);

app.controller('testApp', function( $scope ) {
    $scope.testHTML = '<h1> Welcome :) </h1>';
});

app.directive('bindHtmlUnsafe', function( $parse, $compile ) {
    return function( $scope, $element, $attrs ) {
        var compile = function( newHTML ) {
            newHTML = $compile(newHTML)($scope);
            $element.html('').append(newHTML);        
        };

        var htmlName = $attrs.bindHtmlUnsafe;

        $scope.$watch(htmlName, function( newHTML ) {
            if(!newHTML) return;
            compile(newHTML);
        });

    };
});