我使用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_;
}));
...
});
答案 0 :(得分:1)
我不得不改变每个扩展课程和他们的工厂。有没有更好的方法来解决这个问题
只需注入public void show() {
System.out.println(enclosingInstance.i);
}
,然后基类就可以使用$injector
获得它想要的内容。
或甚至更疯狂......将$injector.get()
(它的单身人士)放在全局范围/或某个模块上......并且只需在您的类中使用它来获取角度特定的东西。