Я пытаюсь дезинфицировать содержимое некоторых текстовых областей, я не могу использовать ng-bind-html
, потому что он нарушает два способа связывания (ng-model
не работает одновременно)
Как ни странно, когда я применяю ng-bind-html
к модели он производит другой результат, когда я использую $sanitize
или $sce
внутри директивы.
Вот пример я сделал
http://plnkr.co/edit/iRvK4med8T9Xqs22BkOe?p=preview
Первая текстовая область использует ng-bind-html
, вторые использует $sanitize
и третий должен быть кодом для директивы нг-связывать-HTML, как я вырван из Исходный код AngularJS.
"
только исправленный изменен "
при использовании нг-Bind-HTML, в двух других примерах изменяется в "
Как я могу воспроизвести результаты 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>
Это интересно.Кажется, что директива 'ngModel' вызывает у вас проблемы, а установка' priority' не будет исправлена. В вашем последнем примере, копируя 'ngBindHtml', если вы замените' ngModel' на другое имя (например, 'bob',' bob = "model" '), оно будет работать. http://plnkr.co/edit/eVA9lvMmwOcWKL1B2fjM?p=preview. Аналогично для вашей второй директивы, за исключением того, что требуется несколько других незначительных изменений re: parsing. – DRobinson
Любопытно услышать полный ответ от кого-то, у кого больше опыта, или время, чтобы вникать в директиву 'ngModel'. Если этого не произойдет, я буду копаться в этом источнике, когда у меня будет немного больше времени :). На данный момент, как я уже упоминал, обновление для другого атрибута работает и для вашей другой директивы, также http://plnkr.co/edit/lVH1IQAhMfAot116xfiM?p=preview – DRobinson
Мне нужно посмотреть, что я могу выкопать на 'ngModel' когда у меня есть шанс. Это позор, изменяющий атрибут, который не позволяет двусторонней привязке к функции еще! – Amicable