将DI延迟加载到基类中

时间:2016-04-22 03:26:07

标签: typescript angular angular2-services

情况:

我有一个基类BaseMain延伸BaseMain通过Base将服务传递到super()Base然后调用该服务上的方法。

问题:

undefined中的服务为Base。除非我在基类之前console.log(_service)。我怀疑通过AsyncRoute与延迟加载相关的竞争条件,或者可能是它的实例化问题......无论哪种方式,我都不确定如何开始纠正它。

Main.ts:

export class Main extends Base {
    constructor(private _service:SomeService) {
        super(this._service);
    }
}

Base.ts:

@Injectable()
export class Base {
    constructor(_service) {
        _service.doSomething(true);
    }
}

代码在_service.doSomething(true)出现错误:

  

EXCEPTION:Main!

实例化时出错      

ORIGINAL EXCEPTION:TypeError:无法读取属性' doSomething'未定义的

但是,如果我试图追踪为什么_service未定义执行以下操作 - 神奇地它可以工作???

Base.ts:

@Injectable()
export class Base {
    constructor(_service) {
        console.log("_service?", _service); // if this is here...
        _service.doSomething(true);  // ...then the error no longer occurs here
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用服务接口来解决此问题,如下所示。

interface IService{
   doSomething();
}

现在修改基类,如下所示。

export class Base {
constructor(_service: IService) {
    _service.doSomething(true); 
  }
}

注意:SomeService应该实现IService 希望这能解决您的问题。

答案 1 :(得分:0)

问题是我使用的是静态服务,所以我应该做SomeService.doSomething()而不是像_service:SomeService那样尝试实例化。

这就是console.log“修复”它的原因 - 它在console.log()语句中被实例化,然后及时存在以便实际使用它。