Отключение строгого контекстного экранирования (SCE) в AngularJS
Я пытаюсь отключить SCE в AngularJS. Согласно документации, вот что нужно сделать:
angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
// Completely disable SCE. For demonstration purposes only!
// Do not use in new projects.
$sceProvider.enabled(false);
});
Это мой app.config.js:
angular.module('yapoApp').config(['$sceProvider', '$locationProvider', '$routeProvider', '$httpProvider',
function config($sceProvider, $locationProvider, $routeProvider, $httpProvider) {
// disable SCE completely (https://docs.angularjs.org/api/ng/service/$sce)
$sceProvider.enabled(false);
$locationProvider.hashPrefix('!');
$routeProvider.when('/actors', {
template: '<actor-list></actor-list>'
}).when('/actors/:actorId', {
template: '<actor-detail></actor-detail>'
}).when('/movies/', {
template: '<movie-list></movie-list>'
}).when('/movies/:movieId', {
template: '<movie-detail></movie-detail>'
}).otherwise('/'), {
template: '<br><br><br><br><h1> This is temp index</h1>'
};
}
]);
И я все еще получаю ошибку:
[$ interpolate: noconcat] Ошибка при интерполяции: /static/movies/{{ $ctrl.movie.id }}/sample/sample.mp4 Строгое контекстное экранирование запрещает интерполяции, которые объединяют несколько выражений, когда требуется доверенное значение.
HTML-шаблон, вызывающий ошибку:
<video width="{{ $ctrl.videoWidth }}px" controls>
<source ng-src="/static/movies/{{ $ctrl.movie.id }}/sample/sample.mp4">
Your browser does not support the video tag.
</video>
Я чувствую, что мне не хватает какой-то простой синтаксической ошибки. Пожалуйста помоги!
2 ответа
Сначала вы должны проверить это, из документа:
Могу ли я полностью отключить SCE?
Да, ты можешь. Тем не менее, это настоятельно не рекомендуется. SCE дает вам много преимуществ в плане безопасности при минимальных затратах на кодирование. Будет намного сложнее взять отключенное приложение SCE и либо обезопасить его самостоятельно, либо включить SCE на более позднем этапе. Возможно, имеет смысл отключить SCE в тех случаях, когда у вас есть много существующего кода, который был написан до появления SCE, и вы переносите их по одному модулю.
Ну, я не думаю, что вам нужно отключить SCE в этом случае, а также, например, если вы используете ngBindHtml
для визуализации HTML-кода AngularJS выдаст ошибку, если переменная области действия не назначена ngBindHtml
обернут $sce.trustAsHtml
,
Но вернемся к ошибке, которая говорит сама за себя:
Ошибка при интерполяции: /static/movies/{{ $ctrl.movie.id }}/sample/sample.mp4
Вам просто нужно объединить его правильно, например так:
<source ng-src="{{'/static/movies/' + $ctrl.movie.id + '/sample/sample.mp4'}}">
Надеюсь, поможет!!
Я нашел это. Видимо, это не проблема SCE. Это проблема с тем, как Angular уживается с тегом "HTML5 Видео" source:.
Если есть только один источник видео, HTML должен выглядеть так:
<video src="ng-src="{{'/static/movies/' + $ctrl.movie.id + '/sample/sample.mp4'}}" width="{{ $ctrl.videoWidth }}px" controls>
Your browser does not support the video tag.
</video>
Вместо этого:
<video width="{{ $ctrl.videoWidth }}px" controls>
<source ng-src="{{'/static/movies/' + $ctrl.movie.id + '/sample/sample.mp4'}}">
Your browser does not support the video tag.
</video>
Решает проблему.
Конечно, @developer033 был верным, и моя первоначальная конкатенация была неправильной.