如何使角度服务可用于独立对象; Angular JS

时间:2014-07-08 08:47:04

标签: javascript angularjs angularjs-service

在我的角度应用中,我正在尝试创建dataAdapter工厂,我可以在开发和发布期间快速切换local adapterapi adapter

我的dataAdapter工厂看起来像这样

myApp.factory('dataAdapter', function($http, $q){
   var dataAdapter = new apiAdapter;
   //var dataAdapter = new localAdapter;
    return dataAdapter;
});

和我的适配器对象(这里是api适配器)看起来像这样。 (这将位于另一个名为apiAdapter.js的文件中)

var apiAdapter = function(){
  return {
    getData : function(){ $http.get(). ....; }
  }
}

现在这对我不起作用,因为apiAdapter对象中没有$ http。现在,如果我在var apiAdapter = function(){....}之前移动var dataAdapter = new apiAdapter;,它就可以了。有没有办法让apiAdapter可以使用角度服务,而无需在工厂内移动它?

我希望,我能够清楚地描述我的问题。

2 个答案:

答案 0 :(得分:3)

我真的没有看到分享这些小功能的重点,所以在我看来它应该看起来像

myApp.factory('dataAdapter', function($http, $q){
    return {
      getData : function(){ $http.get(). ....; }
    }
});

但如果你出于某种原因必须这样做

myApp.factory('dataAdapter', function($http, $q){
   var dataAdapter = new apiAdapter($http);
   //var dataAdapter = new localAdapter;
    return dataAdapter;
});

var apiAdapter = function(http){//
  return {
    getData : function(){ http.get(). ....; }
  }
}

答案 1 :(得分:1)

无论你这样做的原因是什么,这都是它通常以最简单的方式完成的:

var $injector = angular.injector(['ng']);

var apiAdapter = $injectorfunction(){
  return {
    getData : function(){ 
        $injector.invoke(function($http){
            $http.get();
        }); 
    }
  }
}

docs reference 1

docs reference 2