AngularJS和Typescript - 注入到其他服务中的服务未定义

3
我正在使用这个起始模板,并按照这篇SO帖子中提出的修改进行了修改。一直很顺利,但现在我试图将一个服务注入到另一个服务的构造函数中时,注入的值总是'未定义'。没有抛出任何错误。

这里是一个简单的例子:

module app.services {
    export class dashboardFilterService implements IService {
        constructor($rootScope: ng.IRootScopeService) {
            // $rootScope is undefined...
            //$rootScope.$broadcast('FilterInitialized');
        }
    }
}
app.registerService('dashboardFilterService', ['$rootScope']);

将服务注入到控制器中是可行的。我对TypeScript和Angular都比较新,所以对于有更多经验的人来说可能很明显。以下是参考的编译后js代码:

var app;
(function (app) {
    (function (services) {
        var dashboardFilterService = (function () {
            function dashboardFilterService($rootScope) {
                // $rootScope is undefined...
                //$rootScope.$broadcast('FilterInitialized');
            }
            return dashboardFilterService;
        })();
        services.dashboardFilterService = dashboardFilterService;
    })(app.services || (app.services = {}));
    var services = app.services;
})(app || (app = {}));
app.registerService('dashboardFilterService', ['$rootScope']);
2个回答

5

推荐模式:

module app.services {
    export class dashboardFilterService implements IService {
        static $inject = ['$rootScope']; // This should do it
        constructor($rootScope: ng.IRootScopeService) {
            //$rootScope.$broadcast('FilterInitialized');
        }
    }
    app.registerService('dashboardFilterService', dashboardFilterService );
}

PS:我在这个主题上制作了一个视频:http://www.youtube.com/watch?v=Yis8m3BdnEM&hd=1

注:此内容涉及IT技术,仅供参考。

1

我不了解TypeScript,但在JavaScript中进行依赖注入的最安全方式是:

app.service('serviceName', ['$rootScope', 'anotherServ', function($rootScope, anotherService){

}]);

我认为您没有将服务函数作为数组中的最后一个元素传递,因此在您的情况下,应该像这样:

app.registerService('dashboardFilterService', ['$rootScope', dashboardFilterService]);

app.registerService辅助函数确实以那种方式传递参数,所以我仍然不确定为什么那种方法不起作用。以下是代码:export function registerService(className: string, services = []) { var service = className[0].toLowerCase() + className.slice(1); services.push(() => new app.services[className]()); angular.module('app.services').factory(service, services); } - jdraper3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接