【问题标题】:How can I use ng-bind-html inside my directive?如何在指令中使用 ng-bind-html?
【发布时间】:2017-11-14 01:25:26
【问题描述】:

我正在使用基于我的 JSON 的模板。所以,我不能像往常那样使用我的 ng-bind-html。

似乎我唯一的选择是在指令中使用经过清理的 html。 寻找类似的问题,我无法弄清楚如何在我的情况下申请。 是的,我是 Angular 的新手。

我目前正在从我的控制器接收此数据:

$scope.safecontainers = $sanitize($scope.containersmsg);

在我的html中通常是这样的:

<p ng-bind-html="containersmsg"></p>

但我不想要这个,我需要在指令中使用这个 ng-bind-html!

有些人谈到了 $compile,但我真的不知道如何在我的情况下应用。

编辑:

基于cmets,我将添加更多代码,以帮助大家进一步了解我的目标。

在我的 index.html 中,我声明了所需的控制器并调用了我的

<ng-view></ng-view>

然后,根据我收到的内容,我将加载一个或另一个视图:

      <div ng-if='setores[0].SetorTema == "1"'>
        <theme-one titulo="{{setores[0].SetorNome}}" logo="
            {{setores[0].SetorLogo}}" evento="{{evento[0].EventoNome}}">
        </theme-one>
 // I omitted some of the parameters because they ain't relevant
      </div>

我的模板是这样的:(只做一小部分,避免出现很多无用的代码)

  <section class="target">
    <div class="col-md-6 col-xs-12">
        <div class="" ng-repeat="banner in title">
            <div class="target-title">{{ banner.BannerLevelTitulo }}
            </div>
            <div class="target-desc">{{banner.BannerLevelDescricao}}</div>
        </div>
    </div>
    <div class="col-md-6 col-xs-hidden">
        <div class="target-image"><img ng-src="{{targetimage}}" alt="">
        </div>
    </div>
</section>

这是我想要我的净化代码的控制器。

hotsite.controller('containerController', function($scope, $http, $sanitize) 
{


$scope.containers = [];
$scope.containersmsg = '';
$scope.safecontainers = $sanitize($scope.containersmsg);

$http.get('/Admin/rest/getContainer')
.then(function onSuccess(response) {
    var data = response.data;
    $scope.containers = data;

      $scope.containers = response.data.filter(containers => 
containers.ContainerAtivo);
      $scope.containersmsg = $scope.containers[0].ContainerDesc;
  })
 .catch(function onError(response) {
    var data = response.data;
    console.log(data);
  });
});

这是我的指令的一部分:

    angular.module('hotsiteDirectives', [])
.directive('themeOne', function($compile) {
  var ddo = {};

     ddo.restrict = "AE";
     ddo.transclude = true;

     ddo.scope = {
         titulo: '@',
         ...
         (a lot of other scope's)
         contimg: '@'
     };

     ddo.templateUrl = 'app/directives/theme-one.html';

     return ddo;
 })

是的,我正在调用 ngSanitize

var hotsite = angular.module('hotsite',['ngRoute', 'hotsiteDirectives', 
'ngSanitize']);

TL;DR

这是我的代码在指令中的样子,带有原始 html 且未呈现:

这就是它与 ng-bind-html 的工作方式,格式化的 html

如果我确实把它放在我的视图中

    <p ng-bind-html="containersmsg"></p>

没关系,一切正常。

但是,我只需要在我的指令中调用它,我不知道该怎么做。 因此,在这种情况下:

如何将经过净化的 html 放入指令和模板中?

【问题讨论】:

  • 你试过$sce.trustAsHtml(...) 吗?以及其他trustAs and parseAs 函数?
  • 目前还不清楚您的问题是什么。指令在哪里声明?您如何为您传递的各种属性创建 $scope 属性?为什么将这种 HTML 存储在数据变量中而不是普通的模板文件中?将 HTML 存储在变量中的唯一原因是,如果您打算让用户修改内容,但用户通常不会修改(甚至知道)角度属性......这就像你正在尝试以不同于预期的方式使用 AngularJs....
  • @Claies 我将这些变量传递给其他控制器,我只是省略了代码,因为它对问题没有任何价值。是的,我的用户将修改内容。问题是:如何在指令中使用经过清理的数据?
  • 这需要一些工作,因为这不是 angular 的设计方式。为您的用户提供可能存在于$scope 中的属性的名称,要求他们使用角度语法,并希望他们不要进行可能以意想不到的方式修改数据的拼写错误或页面编辑,未选中,似乎一个非常糟糕的想法。
  • $sce 的全部意义在于保护您免受可能输入 HTML sn-ps 的恶意代码的侵害。通过让您的用户直接使用角度语法修改 HTML,您实际上是在尝试完全允许 ​​$sce 阻止的事情。

标签: html angularjs angularjs-directive


【解决方案1】:

您甚至不必相信 html 可以使用 ngBindHtml 呈现它,因为该指令已经为您完成了。您基本上需要为您的指令创建一个参数属性来保存 html 字符串,因此,在指令的模板中,您使用 ng-bind-html="myParam"。

下面的 sn-p 实现了创建一个指令的简单演示,该指令接收并呈现来自控制器的 html 输入参数。

angular.module('app', ['ngSanitize'])
  .controller('AppCtrl', function($scope) {
    $scope.myHtml = '<div><b>Hello!</b> I\'m an <i>html string</i> being rendered dynamicalli by <code>ngBindHtml</code></div>';
  })
  .directive('myDirective', function() {
    return {
      template: '<hr><div ng-bind-html="html"></div><hr>',
      scope: {
        html: '='
      }
    };
  });
<div ng-app="app" ng-controller="AppCtrl">
  <my-directive html="myHtml"></my-directive>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular-sanitize.js"></script>

【讨论】:

  • 它已经在我的模块声明伙伴中,我没有放入我的代码,因为我认为它是隐式的。
  • @AndréSousa 所以,它应该一直在工作。请提供您的其余代码,我不明白为什么这不起作用。
  • @AndréSousa 您想将 html 字符串作为属性参数传递给指令并将其呈现在指令中吗?
  • @AndréSousa 这确实很简单,只是因为 angularjs 的工作原理有点令人困惑。无论如何,我已经用适当的解决方案更新了我的答案。
  • @AndréSousa AngularJS 是一个旧框架,现在正走向弃用,所以我不建议在它上面投入时间,除非你真的必须这样做。无论如何,学习 angularjs 原理的最佳地点是docs.angularjs.org,在 LEARN 部分有教程、免费课程等。你不需要学习更多的知识,而不仅仅是框架的工作原理,一旦你知道了基础,就更容易了当您遇到此类问题时找到其余部分。干杯:{D
猜你喜欢
  • 1970-01-01
  • 2013-06-14
  • 2013-06-29
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多