AngularJS / TypeScript:由于服务而无法实例化模块

时间:2015-11-09 18:32:44

标签: javascript angularjs typescript angular-ui-router angular-ui

我有服务:

module app {
    export interface ISomeService {
        doSomething(): string;
    }

    export class SomeService implements ISomeService {
        doSomething() {
            return "haaay.";
        };
    }

    angular.module('app').service('someService', SomeService);
}

我有一个控制器:

module app {
    export interface ISomeController {
        doControllerThings(): string;
    }

    export class SomeController implements ISomeController {
        static $inject = ['someService'];
        constructor(private someService: ISomeService) { }
        }
    }

    angular.module('app').controller('someController', SomeController);
}

我还有一个路由文件(使用ui-router):

module app {
'use strict';

angular
    .module('app')
    .config(config);

config.$inject = ['$stateProvider', 'someService'];
function config($stateProvider, someService) {
    $stateProvider
    .state('someState', {
        url: '/Home/Hello/',
        parent: 'home',
        resolve: {
            someValues() { return someService.doSomething(); }
        },
        views: {
            'content@': {
                    templateUrl:  /path/to/file/something.html',
                    controller: 'someController',
                    controllerAs: 'vm'
            }
        }
    });
}

我一直收到此错误,我不确定原因:

Error: [$injector:modulerr] Failed to instantiate module app due to:
[$injector:unpr] Unknown provider: someService

我知道我的路由文件目前基本上都是使用普通的javascript,所以我为看了几个TypeScript示例后的大眼睛道歉。

编辑:做了一些更新。错误的复制/粘贴编辑。

1 个答案:

答案 0 :(得分:2)

a working plunker

关键是 - 我们不能要求 'someService' 注入 .config() 阶段。在这种情况下,只能注入和配置提供商

因此,我们需要将服务的依赖项直接转移到 resolver - someValues : ['someService', (someService) => ... //这是要求的地方。 someService&#39 ;.因为这将在 .run() 阶段

中调用
angular
    .module('app')
    .config(config);

config.$inject = ['$stateProvider' ];
function config($stateProvider) {
    $stateProvider
    .state('someState', {
        url: '/Home/Hello/',
        parent: 'home',
        resolve: {          
            someValues : ['someService', (someService) =>
                                        { return  someService.doSomething(); }]
        },
        views: {
            'content@': {
                    templateUrl:  'path/to/file/something.html',
                    controller: 'someController',
                    controllerAs: 'vm'
            }
        }
    });
};

检查行动here