angularjs 我可以使用Angular变量作为音频标签的源代码吗?

z18hc3ub  于 2023-08-02  发布在  Angular
关注(0)|答案(4)|浏览(144)

我尝试做以下几点:

<div ng-repeat="audio in event.audios">
    <audio ng-src="/data/media/{{audio}}" controls></audio>
</div>

字符串
但是当我加载视图时,{{audio}}变量没有被解析,而是按原样硬编码到源代码中。但是,如果我将相同的变量放在audio标签之外,它会正确地呈现音频文件的名称。我试过使用src和ng-src都没有用。
有没有办法让变量在音频标签中工作?
先谢谢你。

tyu7yeag

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()
示例如下:

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

tjvv9vkg

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>


现在一切正常。

yi0zb3m4

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()

j5fpnvbx

j5fpnvbx4#

我用过$sce.trustAsResourceUrl("/data/media/" + newVal),但它不起作用。似乎对我来说起作用的是把document.getElementById('player').src = {{url}}放在控制器中
希望这对其他人有帮助。

相关问题