Отключение строгого контекстного экранирования (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 был верным, и моя первоначальная конкатенация была неправильной.

Другие вопросы по тегам