Lien Plunker
J’ai un élément que je voudrais lier au HTML.
Ça marche. Maintenant, avec elle, j’ai aussi une directive qui est liée au HTML lié:
$scope.details = 'Success! details'
Mais la directive upper
avec le div et l’ancre ne sont pas évaluées. Comment puis-je le faire fonctionner?
J’étais également confronté à ce problème et après des heures de recherche sur Internet, j’ai lu le commentaire de @ Chandermani, qui s’est avéré être la solution. Vous devez appeler une directive “comstackr” avec ce modèle:
.directive('comstack', ['$comstack', function ($comstack) { return function(scope, element, attrs) { scope.$watch( function(scope) { // watch the 'comstack' expression for changes return scope.$eval(attrs.comstack); }, function(value) { // when the 'comstack' expression changes // assign it into the current DOM element.html(value); // comstack the new DOM and link it to the current // scope. // NOTE: we only comstack .childNodes so that // we don't get into infinite loop compiling ourselves $comstack(element.contents())(scope); } ); }; }])
Vous pouvez voir un violon de travail de celui-ci ici
Merci pour l’excellente réponse de vkammerer. Une optimisation que je recommanderais est de ne pas regarder après la compilation une fois. Le paramètre $ eval dans l’expression de surveillance peut avoir des conséquences sur les performances.
angular.module('vkApp') .directive('comstack', ['$comstack', function ($comstack) { return function(scope, element, attrs) { var ensureComstackRunsOnce = scope.$watch( function(scope) { // watch the 'comstack' expression for changes return scope.$eval(attrs.comstack); }, function(value) { // when the 'comstack' expression changes // assign it into the current DOM element.html(value); // comstack the new DOM and link it to the current // scope. // NOTE: we only comstack .childNodes so that // we don't get into infinite loop compiling ourselves $comstack(element.contents())(scope); // Use un-watch feature to ensure compilation happens only once. ensureComstackRunsOnce(); } ); }; }]);
Voici un violon fourchu et mis à jour.
Ajouter cette directive angular-bind-html-comstack
.directive('bindHtmlComstack', ['$comstack', function ($comstack) { return { ressortingct: 'A', link: function (scope, element, attrs) { scope.$watch(function () { return scope.$eval(attrs.bindHtmlComstack); }, function (value) { // Incase value is a TrustedValueHolderType, sometimes it // needs to be explicitly called into a ssortingng in order to // get the HTML ssortingng. element.html(value && value.toSsortingng()); // If scope is provided use it, otherwise use parent scope var comstackScope = scope; if (attrs.bindHtmlScope) { comstackScope = scope.$eval(attrs.bindHtmlScope); } $comstack(element.contents())(comstackScope); }); } }; }]);
Utilisez-le comme ceci:
Vraiment facile 🙂
Malheureusement, je n’ai pas assez de réputation pour commenter.
Je ne pouvais pas faire travailler ça pendant des années. J’ai modifié mon code ng-bind-html
pour utiliser cette directive personnalisée, mais je n’ai pas réussi à supprimer le $scope.html = $sce.trustAsHtml($scope.html)
requirejs pour que ng-bind-html fonctionne. Dès que j’ai supprimé ceci, la fonction de compilation a commencé à fonctionner.
Pour quiconque $sce.trustAsHtml
contenu qui a déjà été exécuté via $sce.trustAsHtml
voici ce que je devais faire différemment
function(scope, element, attrs) { var ensureComstackRunsOnce = scope.$watch(function(scope) { return $sce.parseAsHtml(attrs.comstack)(scope); }, function(value) { // when the parsed expression changes assign it into the current DOM element.html(value); // comstack the new DOM and link it to the current scope. $comstack(element.contents())(scope); // Use un-watch feature to ensure compilation happens only once. ensureComstackRunsOnce(); }); }
Ceci est seulement la partie link
de la directive car j’utilise une disposition différente. Vous devrez injecter le service $sce
ainsi que $comstack
.
La meilleure solution que j’ai trouvée! Je l’ai copié et cela fonctionne exactement comme je le souhaitais. Merci, merci, merci …
dans la fonction de lien directif j’ai
app.directive('element',function($comstack){ . . var addXml = function(){ var el = $comstack(' ')($scope); $scope.renderingElement = el.html(); } . .
et dans le modèle de directive: