![](/img/trans.png)
[英]Why my angular code throw error: cannot read the property of undefined?
[英]Why is my property injection attempt not injecting anything but undefined?
我有一個使用 inversify 的現有打字稿項目。 我在TYPES.ILoggger
TYPES 中定義了一個記錄器,當我直接從我的容器訪問記錄器時,它可以工作:
import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";
const loggerFromTheContainer: ILogger = container.get<ILogger>(TYPES.ILogger);
loggerFromTheContainer.info("I WILL LOG"); // this works
所以我的設置應該沒問題。
我不想直接訪問容器,但我想使用屬性注入。 [InversifyJS' README提供了一個例子:
如果你喜歡它,你可以使用屬性注入而不是構造函數注入,這樣你就不必聲明類構造函數:
@injectable() class Ninja implements Warrior { @inject(TYPES.Weapon) private _katana: Weapon; @inject(TYPES.ThrowableWeapon) private _shuriken: ThrowableWeapon; public fight() { return this._katana.hit(); } public sneak() { return this._shuriken.throw(); } }
我試着遵循那個。
然而,當我嘗試通過屬性注入來注入記錄器時,我突然變得undefined
為記錄器,我不知道為什么:
@injectable()
class ShouldHaveLogger {
@inject(TYPES.ILogger) private logger: ILogger;
constructor() {
this.logger.info("Hello World"); // this.logger will remain undefined
}
}
new ShouldHaveLogger();
它會拋出一個泛型
TypeError: Cannot read property 'info' of undefined
因為this.logger
沒有被注入。 然而,為什么以及如何解決它?
屬性注入的正常行為是讓inversify
為您創建實例。 您現在正在描述一個用例,其中您自己創建了ShouldHaveLogger
的實例(或其他庫正在為您創建它)。
文檔也指出了這一點
為了做到這一點,你需要inversify-inject-decorators ,然后你可以通過@lazyInject
注入記錄器。
您必須使用您的容器設置 lazyInject,您的代碼應如下所示:
import {injectable} from "inversify";
import getDecorators from "inversify-inject-decorators";
import {ILogger} from "./interfaces/ILogger";
import {TYPES} from "./interfaces/TYPES";
import container from "./kernel/inversify.config";
const {lazyInject} = getDecorators(container);
@injectable()
class ShouldHaveLogger {
@lazyInject(TYPES.ILogger) private logger: ILogger;
constructor() {
this.logger.info("I am working now");
}
}
new ShouldHaveLogger();
將根據您的記錄器實現打印:
2019-01-30T09:47:54.890Z - info: "I am working now"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.