如何使用带角度依赖注入的typescript继承

时间:2015-10-08 19:43:44

标签: angularjs dependency-injection typescript

我使用angular构建应用程序,最近切换到TypeScript。我的应用程序的核心包含多个相互交互的实际类(所以不仅仅是全局服务)。我这样做的方式如下:

class Person {
    constructor(private $http, public name: string) {
        // ... use this.$http for some task
    }
}

class PersonFactory {
    static $inject = ['$http'];

    constructor(private $http) {}

    create(name: string) {
        return new Person(this.$http, name);
    }
}

angular.module('app').service('personFactory', PersonFactory);

因此,如果其他一些类需要创建一个Person对象,则需要注入PersonFactory并调用其create方法。即使它需要一些样板,这也可以。

当我想要继承Person:

时,我的主要问题就出现了
class Student extends Person {
    constructor(private $http) {
        super(this.$http, 'Some actual name')
    }
}

我可以遵循与上面相同的模式,但是我需要再次创建一个StudentFactory,它将所需的服务(如$ http)传递给类构造函数,后者又将其传递给构造函数。超级方法。如果我现在有多个这样的扩展类并且会更改基类Person,我必须更改每个扩展类及其工厂。有没有更好的方法来解决这个问题?可能最好只删除核心应用程序中角度服务的所有依赖项,并使用angular作为UI代码吗?

解决方案

正如答案中所建议的那样,我将$ injector服务添加到窗口中,如下所示:

module('app').run(['$injector', function($injector) {
    window.$injector = $injector;
}]);

现在可以在任何类中使用该服务来获取其他服务,例如$ http。 虽然这对单元测试没有用,所以我不得不再次将注入器放在全局范围内:

// MyClass.test.js
var $injector;

describe('My class', function() {
    beforeEach(module('app'));

    beforeEach(inject(function(_$injector_) {
        $injector = _$injector_;
    }));

    ...
});

1 个答案:

答案 0 :(得分:1)

  

我不得不改变每个扩展课程和他们的工厂。有没有更好的方法来解决这个问题

只需注入public void show() { System.out.println(enclosingInstance.i); } ,然后基类就可以使用$injector获得它想要的内容。

或甚至更疯狂......将$injector.get()(它的单身人士)放在全局范围/或某个模块上......并且只需在您的类中使用它来获取角度特定的东西。