Angularjs “如何修复”;已达到10$digest()迭代次数。流产&引用;角度1.2过滤器中的错误?

Angularjs “如何修复”;已达到10$digest()迭代次数。流产&引用;角度1.2过滤器中的错误?,angularjs,angularjs-filter,Angularjs,Angularjs Filter,我在AngularJS 1.2中创建了一个过滤器,它使用ShowdownJS将标记内容解析为HTML: App.filter('markdown', function( $sce ) { var converter = new Showdown.converter(); return function (value) { var html = converter.makeHtml(value); return $sce.trustAsHtml(ht

我在AngularJS 1.2中创建了一个过滤器,它使用ShowdownJS标记内容解析为HTML:

App.filter('markdown', function( $sce ) {
    var converter = new Showdown.converter();
    return function (value) {
        var html = converter.makeHtml(value);
        return $sce.trustAsHtml(html);
    };
});
模板中的绑定使用ng bind html完成。这一个接收到最终HTML内容,因此必须显示内容:

<div ng-bind-html="post.content | markdown"></div>
如何在过滤器中避免这种情况?我找不到任何方法可以从$sce服务中提取转义的html

编辑:如果在配置中禁用“清理”服务,即使代码保持完全相同,也不会出现此错误

$sceProvider.enabled(false);

我认为这与观看它和调用$sce.getTrustedHtml的值有关。您可以通过避免使用
$sce
并使用自己的指令来绕过它:

试一试


好的,经过一些调查,我发现问题出在实例上。每次启动过滤器时,都会返回另一个实例。然后ng绑定html观察程序无限激发

我添加了所有受信任值的缓存:

app.filter('markdown', ['$sce', function( $sce ) {
    var converter = new Showdown.converter();
    var converted = {};

    return function (value) {
      if(converted.hasOwnProperty(value)) {
        return converted[value];
      }

      var html = converter.makeHtml(value);
      var trusted = converted[value] = $sce.trustAsHtml(html);
      return trusted;
    };
}]); 

出现此错误时,我无意中在对象上使用了筛选器而不是字符串。

首先,请使用将digestTtl限制设置为更高的值。您可以执行11次迭代。但我不会超过20-25。过滤器返回$sce服务。。它应该返回字符串。。那是我的问题。。增加ttl并不能解决这个问题。这似乎会在1.2中得到解决。如果我这样做,则无需缓存该值。我得到以下错误:错误:[$sce:unsafe]试图在安全上下文中使用不安全的值。但我希望它是一个筛选器……)它是在一个过滤器中,
simpleHtml
指令只是
ng bind html
的一个替代品,它不需要您使用导致问题的
$sce
。工作非常完美。非常感谢。可悲的是,这是用余烬中的三个括号完成的。。{{{html_value}}}。。完整演示如下:
App.directive('simpleHtml', function() {
  return function(scope, element, attr) {
    scope.$watch(attr.simpleHtml, function (value) {
      element.html(scope.$eval(attr.simpleHtml));
    })
  };
})
return $sce.trustAsHtml(html).toString();
app.filter('markdown', ['$sce', function( $sce ) {
    var converter = new Showdown.converter();
    var converted = {};

    return function (value) {
      if(converted.hasOwnProperty(value)) {
        return converted[value];
      }

      var html = converter.makeHtml(value);
      var trusted = converted[value] = $sce.trustAsHtml(html);
      return trusted;
    };
}]);