逃避我看了一下逃避一切默認和$sce
的角度的方式,所以通過過濾器$sce.trustAsHtml()
我白名單中的數據(因爲$sce
服務無法正常工作),就像這樣:部分HTML字符串中Angular.js
<sup class="ng-binding" ng-bind-html="row|logEntry"></sup>
但問題是,我不相信HTML的某些部分。
要深入細節 - 我有translations其中有HTML,但它們中有可替換的標記/變量。所以translations support HTML,但我不想提供令牌來包含HTML。
我的過濾器logEntry
內部看起來是這樣的:
var translated = $translate('Log.' + msg.context.entity_type) + '.' + msg.context.action, {
'object_name': msg.context.object_name,
'user': msg.context.user_name
});
return $sce.trustAsHtml(translated);
例如,我可以有關於用戶X改變文章的翻譯,但我不希望結果文本觸發警報()如果用戶名包括<script>alert('evilname')</script>
$translate
本身是不相關的,它可以是任何HTML字符串,我想某些部分與普通JS .replace()
與內容停留替換爲「文本」。
所以我的問題是 - 我該如何逃避部分HTML?我是否必須求助於在視圖內部分切片?或者我必須訴諸自定義轉義( Fastest method to escape HTML tags as HTML entities?)?有這樣的事情的首選做法嗎?通過重組你的logEntry
分離出interpolateParams
var translationId = 'Log.' + msg.context.entity_type) + '.' + msg.context.action;
var interpolateParams = {
'object_name': msg.context.object_name,
'user': msg.context.user_name
};
var translated = $translate(translationId, interpolateParams);
return $sce.trustAsHtml(translated);
要從interpolateParams
逃避所有的HTML,但在你的機器翻譯模板留下任何HTML