微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以角度提供和注入函数?

如何解决如何以角度提供和注入函数?

我有需要在任何组件中注入的函数

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]: 

解决方法

定义函数类型:

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

现在的功能:

export const matDialogCallbacks :dialogCB = (dialog: MatDialog,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);

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。