2013-11-26 38 views
13

爲什麼我不能做到這一點:

<div>{{data | htmlfilterexample}}</div> 

時,過濾器裏面,我回:

return $sce.trustAsHtml(input); 

使用<div ng-bind-html="data | htmlfilterexample"></div>作品無論如果過濾器返回input$sce.trustAsHtml(input)

我的印象是,$sce使HTML信任和ng-bind-html不需要由該方法返回的輸出。

謝謝。

+0

我很困惑,你說你做_cannot_''

{{data | htmlfilterexample}}
再後來那它工作,不管你是否返回'input'或'$ sce.trustAsHtml(input)'? –

+0

是的,第一個在{{}}裏面,第二個在ng-bind-html裏面。 – Francisc

回答

33

$sce.trustAsHtml()產生一個可安全使用的字符串ng-bind-html。如果你不在字符串上使用該函數,那麼ng-bind-html會產生錯誤:[$sce:unsafe] Attempting to use an unsafe value in a safe context.因此$ sce並沒有擺脫ng-bind-html的需要,而是它使得它處理的字符串安全地使用它。

ng-bindng-bind-html

使用{{}}之間運行到就在於差異的具體問題是ng-bind等同。所以,看着ng-bind源代碼(ng-bind-* source code),我們看到它使用了這一點:

element.text(value == undefined ? '' : value); 

ng-bind-html,除其他事項外,具有下列功能:

var parsed = $parse(attr.ngBindHtml); 
element.html($sce.getTrustedHtml(parsed(scope)) || ''); 

關鍵外賣之處在於ng-bind使用.texthttp://api.jquery.com/text/)導致正在顯示的字符串的文本表示(忽略它是否可信HTML)。

雖然在HTML中ng-bind-html使用的.htmlhttp://api.jquery.com/html/結果解釋的版本(如果getTrustedHtml()宣佈爲安全)

+0

明白了,謝謝。 – Francisc

+5

說「$ sce.trustAsHtml()產生一個可以安全使用ng-bind-html的字符串」似乎是災難性的誤導和錯誤。它產生* sanitisation bypass *的代理,並且結果可能完全*不安全*與ng-bind-html一起使用。通常,如果與ng-bind-html一起使用的表達式計算爲'X X',腳本元素將被'$ sanitize'移除而保留'XX',但是如果該值是通過trustAsHtml ,腳本標籤將保留。這是它的目的,可以在需要時注入任意的HTML,但它不會使任何「安全」。 – Nick