【问题标题】:show output that get method is deprecated how to solve?显示不推荐使用get方法的输出如何解决?
【发布时间】:2021-04-03 09:46:55
【问题描述】:
    Main.module.ts
           
    @NgModule({
    
        declarations:[HomeComponent,MasterComponent,],         
        imports:[
            BrowserModule,
            FormsModule,
            RouterModule.forRoot(MainRoutes)
        ],
        providers:[
            {
                provide:BaseLogger,
                useClass:DBLogger
            },
            {provide:"1",useClass:DBLogger},   
            {provide:"2",useClass:ConsoleLogger},
        ],
        bootstrap:[MasterComponent]
    })
    export class MainModule{ 
    }

    ***customer.component.ts***
     I just injection  but provide value not shown in the constructor of the component
    
    @Component({
        selector: 'cust-app',
        templateUrl: './customer.view.html',
        styleUrls: ['./customer.view.css']
    })
    export class CustomerComponent {
        title: string = 'Customer Application';
        customerModel:Customer = new Customer();
        customerModels:Array<Customer> = new Array<Customer>();
    
        loggerObj: BaseLogger = null;
        constructor(_injector: Injector) {
    
            this.loggerObj = _injector.get("1"); 
           -- Show error get is deprecated  I got an error here I just want to provide value 
            I do not know how 
            to inject 
            this.loggerObj.Log();
        }
    }

  CustomerApp.logger.ts
  ---------------------

export interface ILogger{
    Log():void;
}

export class BaseLogger implements ILogger{
    Log(){

    }
}
export class ConsoleLogger extends BaseLogger{
    Log(){
        console.log('Using Console Logger..');
    }
}
export class DBLogger extends BaseLogger{
    Log(){
        console.log('Using Database Logger');
    }
   
}
export class FileLogger extends BaseLogger{
    Log():any{
        console.log('Using File Logger');
    }
} 

错误: 你可以看到下面的代码我试图在构造函数中使用注入器 但我没有得到(“1”) 我正在努力做 get 方法已弃用,因此如何从组件的构造函数中提供 1 值。
如果提供的值存在于我想要的主模块的提供者中,我想要什么:[] 这个“1”
但什么也没发生

【问题讨论】:

  • 根据angular.io/api/core/Injector#get,您需要使用类型或注入令牌,而不仅仅是裸字符串。参见例如angular.io/guide/….
  • 而不是 get("1") 你能知道使用哪种方法吗?从 v4.0.0 弃用使用 Type 或 InjectionToken 是的,我已经看到了,但我没有得到?
  • 我已经将您链接到说明如何定义和使用注入令牌的文档。
  • 是的!但我没有将注入器应用于构造函数()
  • 现在我也添加了我的记录器代码?

标签: angular typescript


【解决方案1】:

终于,我得到了答案,下面我将逐步解决这个问题

step 1> I apply DBLogger as a type to get() 
Ex:  constructor(_injector: Injector) {

        this.loggerObj = _injector.get<BaseLogger>("1");
        this.loggerObj.Log();
     }
  Note: DBLogger already Present in CustomerApp.logger.ts

step 2: instead of assign "1" or "2" to the parameter I have used one line
      export const DB=new InjectionToken("1");
      
     and Apply this DB to the parameter to get<BaseLogger>(DB)
Example :
  export class CustomerComponent {
    loggerObj: BaseLogger = null;
    constructor(_injector: Injector) {

        this.loggerObj = _injector.get<BaseLogger>(DB);// 
        this.loggerObj.Log();
    }


step 3: also apply to the provide value also
       providers:[
        {
            provide:BaseLogger,
            useClass:DBLogger
        },
        {provide:DB,useClass:DBLogger},  // here I apply DB instead of "1" 
    ],

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2021-10-23
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多