2013-10-10 63 views
4

我創建了一個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綁定,HTML完成。這一次接收到最終的HTML內容,所以它是強制性的,以展示內容:

<div ng-bind-html="post.content | markdown"></div> 

過濾器的工作原理,但我得到的控制檯這個錯誤,因爲它返回$ SCE服務SHOULD回報只是解析的HTML字符串

10 $digest() iterations reached. Aborting! 

我怎樣才能避免這種情況的過濾?我找不到任何方法可以從$ sce服務中提取轉義的html。

編輯:如果我禁用配置中的清理服務,即使代碼保持完全相同,也不會收到此錯誤。

$sceProvider.enabled(false); 
+0

首先使用http://docs.angularjs.org/api/ng.$ro​​otScopeProvider將digestTtl限制設置爲更高的值。你可以執行11次迭代。但我不會去高於20-25 –

+0

過濾器返回$ sce服務..它應該返回字符串..這是我的問題..增加ttl並不能解決這個問題 – esgy

+1

看來這將被固定在1.2 http ://www.github.com/angular/angular.js/issues/3932不需要緩存值 –

回答

3

確定後一些調查,我發現這個問題是實例。每次過濾器啓動時,都會返回另一個實例。然後,ng-bind-html watcher無限啓動。

Demo

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

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; 
    }; 
}]); 
+0

完美的作品。謝謝。可悲的是,這是在Ember中用三個方括號完成的。{{{html_value}}} ..完整的演示在這裏:[角博客演示](https://github.com/esgy/angularjs-blog-demo) – esgy

1

我認爲這是與ngBindHtmlDirective看着它和值調用$ sce.getTrustedHtml。您可以通過避免$sce和使用自己的指令(plnkr)繞過它:

App.directive('simpleHtml', function() { 
    return function(scope, element, attr) { 
    scope.$watch(attr.simpleHtml, function (value) { 
     element.html(scope.$eval(attr.simpleHtml)); 
    }) 
    }; 
}) 
+0

我希望它是一個過濾器雖然.. :) – esgy

+0

它是在一個過濾器中,'simpleHtml'指令只是'ng-bind-html'的替代品,它不需要使用導致問題的'$ sce'。 –

0

嘗試

return $sce.trustAsHtml(html).toString(); 
+0

如果我這樣做,我得到此錯誤:錯誤:[$ sce:unsafe]試圖在安全的上下文中使用不安全的值。 – esgy

0

當我有這個錯誤,我不小心被利用的對象,而不是一個串上的過濾器。

相關問題