Подтвердить что ты не робот

Предоставление директив в $sce.trustAsHtml

Я включил Plunker здесь: http://plnkr.co/edit/4vqV8toHo0vNjtfICtzI?p=preview

Я пытаюсь добавить кнопку в DOM, и при щелчке должен выполнить связанную с ней функцию. В этом случае он должен предупредить "тестирование". Вот код.

контроллер

app.controller('MainCtrl', function($scope, $sce) {
        $scope.trustedHtml = $sce.trustAsHtml('<button ng-click="testAlert()">Submit</button>');  

        $scope.testAlert = function () {
            alert('testing')
        };
});

HTML

<body ng-controller="MainCtrl">
    <div ng-bind-html="trustedHtml"></div>
</body>
4b9b3361

Ответ 1

$sce.trustAsHtml и ng-bind-html не предназначены для создания HTML с директивами. Этот метод не будет работать.

Это связано с тем, что angular работает, сначала компилируя, а затем привязывая. См. Концептуальный обзор для хорошего объяснения.

Короче говоря, к моменту связывания HTML, определенного в вашем trustAsHtml, для angular слишком поздно компилировать (и, следовательно, понимать) директиву ng-click.

Чтобы динамически добавлять HTML, вы должны смотреть на службу $compile (и/или директивы). Документы здесь.

Ответ 2

Извините за мой плохой английский.

Для Angular 1.6.1 я нашел решение, которое сработало для меня.

шаблон:

<div ng-bind-html="trustAsHtml(content);" init-bind> </div>

В контроллере:

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

Директива

.directive('initBind', function($compile) {
return {
        restrict: 'A',
        link : function (scope, element, attr) {
            attr.$observe('ngBindHtml',function(){
                if(attr.ngBindHtml){
                     $compile(element[0].children)(scope);
                }
            })
        }
    };
})