我正在尝试在角度JS应用中实现视频元素,而ng-src将不会读取范围变量
我正在使用1.2.0-rc.2
<!DOCTYPE html>
<html ng-app="ngView">
<head>
<script src="http://code.angularjs.org/1.2.0-rc.2/angular.min.js"></script>
<script>
var app = angular.module('ngView', []);
function MyControl($scope){
$scope.file = '1234.mp4';
}
</script>
</head>
<body ng-controller="MyControl">
<video controls ng-src="http://www.thebigdot.com/{{file}}"></video>
</body>
</html>
如果我使用更旧版本的AngularJS lib,它可以工作。
cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.3/angular.min.js (works)
这是最新版本中的错误还是故意禁用?有什么工作?
答案 0 :(得分:33)
Angular 1.2默认启用Strict Contextual Escaping(SCE)。您需要稍微调整一下代码才能使其正常工作。
更改标记,以便ng-src
绑定到变量而不是之前设置的URL +变量:
<video controls ng-src="{{videoUrl}}"></video>
添加$sce
以注入SCE提供程序,并使用$sce.trustAsResourceUrl
方法设置videoUrl
。
function MyControl($scope, $sce) {
var videoUrl = 'http://www.thebigdot.com/1234.mp4';
$scope.videoUrl = $sce.trustAsResourceUrl(videoUrl);
}
以下是此设置的JS Bin demo。
答案 1 :(得分:6)
Error: [$interpolate:noconcat] Error while interpolating: http://www.thebigdot.com/{{file}}
Strict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce
http://errors.angularjs.org/1.2.0-rc.2/$interpolate/noconcat?p0=http%3A%2F%2Fwww.thebigdot.com%2F%7B%7Bfile%7D%7D
at http://code.angularjs.org/1.2.0-rc.2/angular.js:78:12
at $interpolate (http://code.angularjs.org/1.2.0-rc.2/angular.js:6953:17)
at attrInterpolateLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:5367:27)
at nodeLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:5121:13)
at compositeLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:4640:15)
at nodeLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:5115:24)
at compositeLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:4640:15)
at compositeLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:4643:13)
at publicLinkFn (http://code.angularjs.org/1.2.0-rc.2/angular.js:4549:30)
at http://code.angularjs.org/1.2.0-rc.2/angular.js:1157:27 angular.js:7861
本文解释了正在发生的事情以及如何禁用严格上下文转义:http://docs.angularjs.org/api/ng.$sce
答案 2 :(得分:2)
我构建了这个指令
app.directive('loadAudio', function($parse) {
return {
restrict: 'EA',
scope: {
source: '=',
},
template: '<audio />',
link: function(scope, iElement, iAttrs) {
scope.$watch('source', function(value) {
var audio = iElement.find('audio');
audio.attr('src', value);
}, true);
}
}
});
接下来是我在模板上写的内容
<load-audio source="your_src" ></load-audio>
答案 3 :(得分:0)
在我找到上一篇文章之前,我做了简单的黑客攻击。有人可以找到这个有用的
HTML:
<div id="videoTag"></div>
Controller.js
document.getElementById("videoTag").innerHTML = "<video width='auto' height='auto' controls autoplay src=" + $scope.details.preview + ">Your browser does not support video</video>";
答案 4 :(得分:0)
我对版本1.5.0的角度有同样的问题。当我更改版本(我使用1.4.8版本)时,我的问题就解决了。
.controller('MainCtrl',['$scope','$stateParams','DepartementFactory',
function($scope,$stateParams,DepartementFactory) {
$scope.currentDate=new Date();
DepartementFactory.getDepartements().then(function(data){
$scope.departements=data;
$scope.departements.logo="work";
});
}
]
)
<div class="work">
<a>
<img src="images/{{departements.logo}}" class="media" alt=""/>
<div class="caption">
<div class="work_title">
<h1>{{departements.libelle}}</h1>
</div>
</div>
</a>
</div>