【问题标题】:How to provide and inject functions in angular?如何以角度提供和注入功能?
【发布时间】:2020-12-22 15:59:09
【问题描述】:

我有我需要在任何组件中注入的功能:

export const matDialogCallbacks = (dialog: MatDialog, document: Document, renderer: Renderer2) => {
    dialog.afterOpened.subscribe(() => renderer.addClass(document.body, 'overflow-hidden'));
    dialog.afterAllClosed.subscribe(() => renderer.removeClass(document.body, 'overflow-hidden'));
};

我需要注入它并使用:

 constructor(private matDialogCallbacks: matDialogCallbacks, private dialog: MatDialog) {
    matDialogCallbacks(dialog);
}

怎么做?

我做了服务:

import { Injectable, Inject, Renderer2 } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { DOCUMENT } from '@angular/common';

@Injectable({
    providedIn: 'root',
})
export class DialogEventsService {
    constructor(@Inject(DOCUMENT) private document: Document, private renderer: Renderer2) {}

    init(dialog: MatDialog) {
        dialog.afterOpened.subscribe(() => this.renderer.addClass(this.document.body, 'overflow-hidden'));
        dialog.afterAllClosed.subscribe(() => this.renderer.removeClass(this.document.body, 'overflow-hidden'));
    }
}

当我尝试在组件中使用此服务时,我得到以下信息:

NullInjectorError: R3InjectorError(OrdersDistributionModule)[DialogEventsService -> DialogEventsService -> Renderer2 -> Renderer2 -> Renderer2]: 

【问题讨论】:

    标签: angular angular-services angular-dependency-injection


    【解决方案1】:

    定义函数类型:

    type dialogCB= (dialog: MatDialog, document: Document, renderer: Renderer2) => void
    

    现在是函数:

    export const matDialogCallbacks :dialogCB = (dialog: MatDialog, document: Document, renderer: Renderer2) => {
    
          dialog.afterOpened.subscribe(() => renderer.addClass(document.body, 'overflow-hidden'));
    
          dialog.afterAllClosed.subscribe(() => renderer.removeClass(document.body, 'overflow-hidden'));
    };
    

    现在创建一个令牌:

    import { InjectionToken } from '@angular/core';
    
    export const TOKEN_NAME = new InjectionToken<dialogCB>('dialog callback');
    

    现在在根模块中提供它:

    providers: [{ provide: TOKEN_NAME, useValue: matDialogCallbacks  }]
    

    最后你可以注入它:

    constructor(@Inject(TOKEN_NAME) private matDialogCallbacks: dialogCB, private dialog: MatDialog) {
    matDialogCallbacks(dialog);
    

    }

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2023-03-30
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多