Проблемы с принудительным экранированием символов при создании элемента AngularJs

Я наткнулся на проблему с AngularJS и создания элементов. Вкратце: мне нужно создать элемент с содержимым html, но я хочу, чтобы ссылка на этот элемент была под рукой, чтобы я мог выполнить некоторые действия с ним, фактически не отображая его в браузере.

Я пытался сделать следующее:

var template = angular.element('<div>' + templateString + '</div>');
$compile(template)($scope);

который делает свое дело, но... Некоторые из этих шаблонов имеют логическое выражение в них. в примере:

<div ng-if="a && b">something</div>

К сожалению, кажется, что когда я пытаюсь создать такой элемент, независимо от того, использую ли я $sce.trustAsHtml() с ng-bind-html или нет & символы в этих условиях экранируются как &amp;, HTML, который я получаю в шаблоне, выглядит так:

<div ng-if="a &amp;&amp; b">something</div>

Пожалуйста, взгляните на скрипку: https://jsfiddle.net/3uxdrp7b/1/

если это известная проблема - я был бы благодарен за то, что указал мне правильное направление, потому что я уже довольно долго бился об это и не могу заставить его работать. У каждого примера, на который я смотрел, был простой HTML внутри привязки - все работает нормально, если я не использую проклятый &,

1 ответ

Основная проблема заключается в том, что элемент не обновляется сразу после компиляции. Он будет содержать правильное значение после завершения текущего цикла дайджеста.

<!-- HTML -->
<div class="container" ng-app="app" ng-controller="DemoController">
  <h3>Result:</h3> <span ng-bind-html="el"></span>
</div>

// js
var app = angular.module("app", ["ngSanitize"]);
app.controller("DemoController", ["$scope", "$compile", "$timeout",
    function($scope, $compile, $timeout) {
    $scope.a = true;
    $scope.b = true;
    let contents = "<div ng-if='a && b'>something</div>";
    let compiled = $compile("<div>" + contents + "</div>")($scope);

    $timeout(function(){
      console.log(compiled.html());
      $scope.el = compiled.html();
    },0,true);
  }]);

Скрипка: https://jsfiddle.net/vy9svmop/

Возможно, в вашем случае проще использовать службу $interpolate для получения немедленного результата.

Другие вопросы по тегам