我尝试做以下几点:
<div ng-repeat="audio in event.audios"> <audio ng-src="/data/media/{{audio}}" controls></audio> </div>
字符串但是当我加载视图时,{{audio}}变量没有被解析,而是按原样硬编码到源代码中。但是,如果我将相同的变量放在audio标签之外,它会正确地呈现音频文件的名称。我试过使用src和ng-src都没有用。有没有办法让变量在音频标签中工作?先谢谢你。
tyu7yeag1#
除了在图像上使用ngSrc指令之外,我对它并不太熟悉,但它可能需要在源代码中的某个地方使用img标记。试试这个:
<div ng-repeat="audio in event.audios"> <audio ng-attr-src="/data/media/{{audio}}" controls></audio> </div>
字符串ng-attr- directive可用于在Angular 中没有特定角色的任何属性。您可以在this page上了解更多信息。"更新,我错了“我创建了一个jsfidle并找到了实际发生的错误。您收到来自SCE服务的错误。请参见SO问题here。解决方案是使用$sce.trustAsResourceUrl()。示例如下:
$sce.trustAsResourceUrl()
angular.module('AudioTest', []) .controller('AudioTestCtrl', function($scope, $sce) { $scope.event = { 'audios': [ $sce.trustAsResourceUrl('/data/media/test1'), $sce.trustAsResourceUrl('/data/media/test2') ]}; });
型Here's the fiddle的函数。
更新#2
如果您不想在从服务器获得响应后将url设置为硬编码或循环访问,则可以使用自定义过滤器来完成您要查找的内容。此方法不使用插值,而插值是引发错误的地方。JS:
angular.module('AudioTest', []) .filter('trustedAudioUrl', function($sce) { return function(path, audioFile) { return $sce.trustAsResourceUrl(path + audioFile); }; }) .controller('AudioTestCtrl', function($scope) { $scope.event = { 'audios': ['test1', 'test2']}; });
型超文本标记语言:
<div ng-app="AudioTest"> <div ng-controller="AudioTestCtrl"> <div ng-repeat="audio in event.audios"> <audio ng-src="/data/media/ | trustedAudioUrl:audio)" controls></audio> </div> </div> </div>
型还有new fiddle。
tjvv9vkg2#
好的,感谢JoeBiz的输入和一些思考,我通过创建一个指令解决了这个问题,这里是代码:
app.directive('audios', function($sce) { return { restrict: 'A', scope: { code:'=' }, replace: true, template: '<audio ng-src="{{url}}" controls></audio>', link: function (scope) { scope.$watch('code', function (newVal, oldVal) { if (newVal !== undefined) { scope.url = $sce.trustAsResourceUrl("/data/media/" + newVal); } }); } }; });
字符串然后在模板上我用了这样的方法:
<div ng-repeat="audio in event.audios"> <div audios code="audio"></div> </div>
型现在一切正常。
yi0zb3m43#
嘿FWIW我发现这个页面正在寻找一个解决方案模板URL的我的音频标签。但是,我使用多个源标记来支持跨浏览器:
<audio id="myAudioTag"> <source ng-src="{{sceSoundUrlMp3}}"> <source ng-src="{{sceSoundUrlOgg}}"> </audio>
字符串首先,我通过白名单 .ogg,.mp3解决了SCE问题:(保留'self',否则您将来的请求将失败)
.config(function($sceDelegateProvider) { $sceDelegateProvider.resourceUrlWhitelist([ "self", /(mp3|ogg)$/, ]); })
型这停止了SCE错误,但Firefox报告“没有源代码”,并且没有注意到添加了src标记angular。最后一步是在信任并设置$scope.sceSoundUrlMp3之后调用load:$('#myAudioTag')[0].load()个
src
$scope.sceSoundUrlMp3
$('#myAudioTag')[0].load()
j5fpnvbx4#
我用过$sce.trustAsResourceUrl("/data/media/" + newVal),但它不起作用。似乎对我来说起作用的是把document.getElementById('player').src = {{url}}放在控制器中希望这对其他人有帮助。
$sce.trustAsResourceUrl("/data/media/" + newVal)
document.getElementById('player').src = {{url}}
4条答案
按热度按时间tyu7yeag1#
除了在图像上使用ngSrc指令之外,我对它并不太熟悉,但它可能需要在源代码中的某个地方使用img标记。
试试这个:
字符串
ng-attr- directive可用于在Angular 中没有特定角色的任何属性。您可以在this page上了解更多信息。
"更新,我错了“
我创建了一个jsfidle并找到了实际发生的错误。
您收到来自SCE服务的错误。请参见SO问题here。
解决方案是使用
$sce.trustAsResourceUrl()
。示例如下:
型
Here's the fiddle的函数。
更新#2
如果您不想在从服务器获得响应后将url设置为硬编码或循环访问,则可以使用自定义过滤器来完成您要查找的内容。此方法不使用插值,而插值是引发错误的地方。
JS:
型
超文本标记语言:
型
还有new fiddle。
tjvv9vkg2#
好的,感谢JoeBiz的输入和一些思考,我通过创建一个指令解决了这个问题,这里是代码:
字符串
然后在模板上我用了这样的方法:
型
现在一切正常。
yi0zb3m43#
嘿FWIW我发现这个页面正在寻找一个解决方案模板URL的我的音频标签。但是,我使用多个源标记来支持跨浏览器:
字符串
首先,我通过白名单 .ogg,.mp3解决了SCE问题:(保留'self',否则您将来的请求将失败)
型
这停止了SCE错误,但Firefox报告“没有源代码”,并且没有注意到添加了
src
标记angular。最后一步是在信任并设置
$scope.sceSoundUrlMp3
之后调用load:$('#myAudioTag')[0].load()
个j5fpnvbx4#
我用过
$sce.trustAsResourceUrl("/data/media/" + newVal)
,但它不起作用。似乎对我来说起作用的是把document.getElementById('player').src = {{url}}
放在控制器中希望这对其他人有帮助。