一部のテキスト領域のコンテンツをサニタイズしようとしていますが、ng-bind-html
双方向バインディングが壊れているため使用できませng-model
ん (同時には機能しません)。
奇妙なことng-bind-html
に、モデルに適用すると、ディレクティブを使用し$sanitize
たり、内部で使用したりすると、異なる結果が生成されます。$sce
これが私が作ったサンプルです
http://plnkr.co/edit/iRvK4med8T9Xqs22BkOe?p=preview
最初のテキスト領域は を使用しng-bind-html
、2 番目は を使用$sanitize
し、3 番目は AngularJS ソース コードから切り取った ng-bind-html ディレクティブのコードである必要があります。
"
"
ng-bind-html を使用する場合にのみ修正され、他の 2 つの例では次のように変更されます"
ng-bind-html
双方向バインディングを維持しながら、ディレクティブの結果を複製するにはどうすればよいですか?
angular.module('sanitizeExample', ['ngSanitize'])
.controller('ExampleController', ['$scope', '$sce',
function($scope, $sce) {
$scope.value = 'This in "quotes" for testing';
$scope.model = 'This in "quotes" for testing';
}
]).directive('sanitize', ['$sanitize', '$parse', '$sce',
function($sanitize, $parse, $sce) {
return {
restrict: 'A',
replace: true,
scope: true,
link: function(scope, element, attrs) {
var process = function(input) {
return $sanitize(input);
//return $sce.getTrustedHtml(input);
};
var processed = process(scope.model);
console.log(processed); // Output here = This in "quotes" for testing
$parse(attrs.ngModel).assign(scope, processed);
//element.html(processed);
}
};
}
])
.directive('sanitizeBindHtml', ['$parse', '$sce',
function($parse, $sce) {
return {
restrict: 'A',
replace: true,
scope: true,
link: function(scope, element, attrs) {
var parsed = $parse(attrs.ngModel);
function getStringValue() {
var value = parsed(scope);
getStringValue.$$unwatch = parsed.$$unwatch;
return (value || '').toString();
}
scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {
var processed = $sce.getTrustedHtml(parsed(scope)) || '';
$parse(attrs.ngModel).assign(scope, processed)
});
}
};
}
]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular-sanitize.js"></script>
<!doctype html>
<html lang="en">
<body ng-app="sanitizeExample">
<div ng-controller="ExampleController">
<textarea ng-bind-html="value"></textarea>
<br/>{{value}}
<br/>
<br/>
<textarea sanitize ng-model="model"></textarea>
<br/>
<br/>
<textarea sanitize-bind-html ng-model="model"></textarea>
</div>
</body>