在Provider的$ get方法中注入服务

时间:2014-06-11 07:58:10

标签: angularjs dependency-injection bluetooth-lowenergy

我的角度应用程序有两种不同的蓝牙低功耗服务实现。

所以我创建了一个通用bluetoothServiceProvider,它应该返回正确的蓝牙服务实现。一个是cordovaBluetoothService,另一个是chromeBluetoothService。所以我检查window属性并决定我需要哪一个。

我知道我可以将这两项服务注入$get函数,如

this.$get = [
    'chromeBluetoothService',
    'cordovaBluetoothService',
    function(chromeBtS, cordovaBtS) {
        if(window.cordova) {
            return cordovaBtS;
        else {
            return chromeBtS;
        }
    }
];

但这不是最优的,因为两个依赖项都在注入时实例化(我不想在实现中进行特征检测),所以我希望它们在if子句中实例化。我该怎么做?

我试过了:

var $injector = angular.injector();
return $injector.get('chromeBluetoothService');

但它会返回Unknown provider: chromeBluetoothServiceProvider <- chromeBluetoothService

如果我这样做:var $injector = angular.injector('myApp.services');

它无法实例化模块,因为这仍然是配置阶段。

1 个答案:

答案 0 :(得分:1)

您应该注入应用的$injector(因此它了解您的应用可用的服务) 幸运的是,$injector服务知道如何注入自己:

this.$get = ['$injector', function ($injector) {
    if (window.cordova) {
        return $injector.get('cordovaBluetoothService');
    else {
        return $injector.get('chromeBluetoothService');
    }
}