Javascript 在AngularJs控制器中使用外部类

Javascript 在AngularJs控制器中使用外部类,javascript,angularjs,Javascript,Angularjs,我不太明白如何注入外部构造函数,我有一个构造函数: function myAudio(url){ var song = new Audio(); song.crossOrigin = "anonymous"; song.src = url; var source = context.createMediaElementSource(song); source.connect(context.destination); this.play = f

我不太明白如何注入外部构造函数,我有一个构造函数:

function myAudio(url){
    var song = new Audio();
    song.crossOrigin = "anonymous";
    song.src = url;
    var source  = context.createMediaElementSource(song);
    source.connect(context.destination);

    this.play = function(){
        source.mediaElement.play();
    } 

}
在外部,只要使用Javascript就可以了。我可以使用
var myVar=newmyaudio(“一些url”)

我想在AngularJS控制器中使用该构造函数,但我就是不知道该怎么做

我试图在控制器中声明它,但没有成功

app.controller("myAppCtrl", myMainFunction);
myMainFunction.$inject = ["$interval", "myAudio"];
function myMainFunction($interval, myAudio) {
   scope = this;
   //my controller stuff
}
试图让它返回一个对象,但我没有找到正确的方法


我不知道我遗漏了什么…

将类注册为服务,就像注册控制器一样

app.service("myAudio", myAudio);
关于服务和注入的一个很好的总结:

诸如此类

app.factory('MyAudio', function() {
    function MyAudio(url){
        var song = new Audio();
        song.crossOrigin = "anonymous";
        song.src = url;

        this.source = context.createMediaElementSource(song);
        this.source.connect(context.destination);
    }

    MyAudio.prototype.play = function(){
        this.source.mediaElement.play();
    };

    return MyAudio;
});

app.controller("myAppCtrl", myMainFunction);
myMainFunction.$inject = ["$interval", "MyAudio"];
function myMainFunction($interval, MyAudio) {
    this.myAudio = new MyAudio('/some/url.mp3');
    this.myAudio.play();
    // controller stuff
}

服务是angular使用构造函数定义创建的单例(类似于
myAudio
)。为了注入singleton服务,您需要告诉angular使用以下定义实例化它:

app.service("myAudio", myAudio);

function myAudio(url){
  var song = new Audio();
  song.crossOrigin = "anonymous";
  song.src = url;
  var source  = context.createMediaElementSource(song);
  source.connect(context.destination);

  this.play = function(){
      source.mediaElement.play();
  } 

}

然后,您可以将其注入控制器或其他服务中。有关更多详细信息,请参阅

首先将其注册为服务。服务返回一个单例,DI将注入“url”,并抛出一个异常。如果成功,我只需确保每次需要更改url时都删除该对象