javascript - AngularJS 过滤器错误地返回 HTML

标签 javascript html angularjs filter sanitize

我有一个返回 HTML 的过滤器,但 Angular 没有正确显示它。我包含了 angular-sanitize.min.js,并在不同的地方尝试了 ng-bind-html 和 $sce。我知道我已经很接近了,但在这方面纠结了几天之后,我想我应该寻求一些专家的见解。一般来说,我对 Angular 和 javascript 还很陌生。感谢您的帮助。

证明我已 sanitizer

<script src="lib/angular/angular-sanitize.min.js"></script>

app.js -- 包括清理和过滤我正在使用

var myApp = angular.module('myApp', [
  'ngRoute',
  'clownfishControllers',
  'ngSanitize'
]);

myApp.filter('fmtIt', function () {
  return function (name) {
    var parts = name.split(' "');
    if (parts.length == 2) {
      return "<i>".concat(parts[0], "</i>", ' "', parts[1]);
    } else {
      return "<i>".concat(parts[0], "</i>");
    }
  }
});

list.html -- 我在 html 文件中的两个例子

<h2 ng-bind-html="item.name | fmtIt"></h2> --strips off html in output
<h2>{{item.name | fmtIt }}</h2>  --shows html tags in output

controllers.js——我尝试将 $sce 注入(inject)其中的 Controller 之一。

clownfishControllers.controller('ListCtrl', ['$scope', '$http', 'Parents', '$sce', function($scope, $http, Parents, $sce) {
  $http.get('js/data.json').success(function(data) {
    $scope.clownfish = data;
    $scope.clownfishOrder = 'name';
    $scope.parents = Parents;
    console.log($scope);

  });
}]);

app.js -- 最近的两次其他尝试,我尝试将此作为附加过滤器堆叠在 fmtIt 过滤器上

myApp.filter('trustAsHTML', ['$sce', function($sce){
  return function(text) {
    return $sce.trustAsHtml(text);
  };
}]);

-- 最初尝试这个是为了获得 $sce

myApp.filter('fmtIt', function ($sce) {
  return function (name) {
    var parts = name.split(' "');
    if (parts.length == 2) {
      return $sce.trustAsHtml("<i>".concat(parts[0], "</i>", ' "', parts[1]));
    } else {
      return $sce.trustAsHtml("<i>".concat(parts[0], "</i>"));
    }
  }
});

最佳答案

很难从您发布的内容中判断出您的问题出在哪里,但也许一个有效的演示可以让您比较您的实现并确定哪里出了问题。

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

app.controller('NamesCtrl', function($scope){
  $scope.names = [
    {first: 'Jennifer Ann', last: 'Meade'},
    {first: 'Colin', last: 'Davis'},
    {first: 'Karen Walker', last: 'Johnson'}
  ];
});

app.filter('fmtIt', function () {
  return function (name) {
    var parts = name.split(' ');
    if (parts.length == 2) {
      return "<i>".concat(parts[0], "</i>", ' ', parts[1]);
    } else {
      return "<i>".concat(parts[0], "</i>");
    }
  };
});
<script src="https://code.angularjs.org/1.3.17/angular.js"></script>
<script src="https://code.angularjs.org/1.3.17/angular-sanitize.js"></script>

<div ng-app="demo" ng-controller="NamesCtrl">
  <h1 ng-repeat="name in names"><span ng-bind-html="name.first | fmtIt"></span> {{name.last}}</h1>
</div>

此演示与您发布的示例代码中的第一个实现之间的一个区别是,我在空间上拆分而不是 ",但在我的演示和相应的数据中更改了它,似乎没有任何影响。

请注意,angular.js 必须在脚本标签中的 angular-sanitize.js 之前加载。虽然,如果您如所示在模块中正确注入(inject) ngSanitize,则会出现注入(inject)错误。

关于javascript - AngularJS 过滤器错误地返回 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271789/

相关文章:

javascript - 如何在express js中间件函数中向RequestHandler声明自定义 Prop ?

javascript - 浏览器页面中选定文本的坐标

javascript - 如何禁用鼠标滚动?

html - 将某些 html 元素复制或转换到新的子窗口

javascript - 我可以在JavaScript中以编程方式为文件输入元素触发“点击”事件吗?

javascript - 如何使用 goog.module 动态加载模块

javascript - 自动进度输入字段在 Firefox 中删除 '0' s

angularjs - 选中/取消选中所有复选框 - AngularJS ng-repeat

angularjs - 从 Controller $scope 发出的事件 $ 并不总是到达 $rootScope 中定义的监听器

javascript - AngularJS:在 $scope 中搜索匹配值