Javascript JS停止播放的当前音频对象加载新对象

Javascript JS停止播放的当前音频对象加载新对象,javascript,angularjs,Javascript,Angularjs,我正在使用Ionic和AngularJS创建一个播客应用程序 我有两种看法: 列表视图(显示所有播客) 详细视图(选定播客) 每次用户打开详细视图时,我都会从数据库中获取新的播客URL,并将其加载到新的音频对象中 sound = new Audio($scope.mp3); 如果我播放一个播客,然后返回列表视图,选择另一个播客并播放它,当前播放的播客不会停止,然后我会同时播放两个(或多个) angular.module('starter.controllers',['fireba

我正在使用Ionic和AngularJS创建一个播客应用程序

我有两种看法:

  • 列表视图(显示所有播客)

  • 详细视图(选定播客)

每次用户打开详细视图时,我都会从数据库中获取新的播客URL,并将其加载到新的音频对象中

sound = new Audio($scope.mp3);
如果我播放一个播客,然后返回列表视图,选择另一个播客并播放它,当前播放的播客不会停止,然后我会同时播放两个(或多个)

angular.module('starter.controllers',['firebase']))
.controller('AppCtrl',函数($scope、$IonicModel、$timeout){
//初始化Firebase
//在爱奥尼亚的新视图缓存中,只调用控制器
//当它们被重新创建或在应用程序启动时,而不是每次页面更改时。
//要侦听此页面何时处于活动状态(例如,刷新数据),
//侦听$ionicView.enter事件:
//$scope.$on('$ionicView.enter',函数(e){
//});
//登录模式的表单数据
$scope.loginda={};
//创建我们稍后将使用的登录模式
$ionicModal.fromTemplateUrl('templates/login.html'{
范围:$scope
}).then(功能(模态){
$scope.modal=modal;
});
//在登录模式中触发以关闭它
$scope.closeLogin=function(){
$scope.modal.hide();
};
//打开登录模式
$scope.login=函数(){
$scope.modal.show();
};
//当用户提交登录表单时执行登录操作
$scope.doLogin=函数(){
log('Doing login',$scope.loginda);
//模拟登录延迟。删除此延迟并替换为您的登录
//使用登录系统时的代码
$timeout(函数(){
$scope.closeLogin();
}, 1000);
};
})
//浏览控制器
.controller('BrowseCtrl',函数($scope、$http、$firebaseArray){
//创建播客参考
const dbreObject=firebase.database().ref().child('podcast');
$scope.playlists=$firebaseArray(DbreObject);
log($firebaseArray(dbreobject));
})
//播客详细控制器
.controller('podcastcrldetailed',函数($scope、$http、$stateparms、$firebaseArray){
//URL参数
var podcastRefID=$stateParams.playlyid;
const oneRef=firebase.database().ref().child('podcasts').child(podcastRefID).on('value',函数(快照){
$scope.mp3=snapshot.val().audio;
声音=新音频($scope.mp3);
$scope.playSong=函数(){
如果(sound.duration>0&&!sound.paused){
声音。暂停();
}否则{
声音。播放();
}
}; 
},函数(errorObject){
log(“读取失败:+errorObject.code”);
});

});
看起来像是为每个播客引用(…
.child('podcasts').child(podcasterfid)
创建了一个新的
新音频($scope.mp3)

尝试通过在更高的范围内声明单个共享音频引用,并将其与
var podcastRefID=$stateParams.playlaid


当所选播客更改时,您希望暂停并更新
src
,您可以发布其余代码吗?我的猜测是,修复方法是让专用音频元素在其他视图的上下文之外进行直播。一个
audio
元素负责播放mp3,只需更新该元素的
src
即可确保只播放一个声音。我现在添加了完整的代码。我认为新的音频会不断创建新的对象,而不是像变量一样替换它们。嗯……你试过var sound=新音频($scope.mp3)?这是原始代码。我不知道为什么我已经把它摘下来了,但问题仍然是如何播放这首歌。您将有一个sound var的单实例。我假设,在您的代码中,每次单击另一个播客时,您都不会重新加载当前播客的控制器,而是创建一个新的控制器。