gpt4 book ai didi

angular - 正确理解 angular14 中的注入(inject) - 必须从注入(inject)上下文中调用 inject()

转载 作者:行者123 更新时间:2023-12-05 03:23:28 32 4
gpt4 key购买 nike

我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。

我正在尝试创建一些静态函数来使用包 ngx-toastr 发送零食消息,但这个包与我的问题无关。我如何正确地实现显示零食消息的函数,同时向它们注入(inject)它们运行所需的模块。

这是我的 messages.ts文件:

import {inject} from '@angular/core';
import {ToastrService} from 'ngx-toastr';


export const snackMsgSuccess = (msg: string, title?: string) => {
const toaster = inject(ToastrService);
toaster.success(msg, title, {
easeTime: 1000
});
};


export const snackMsgInfo = (msg: string, title?: string) => {
const toaster = inject(ToastrService);
toaster.info(msg, title, {
easeTime: 1000
});
};

export const snackMsgWarn = (msg: string, title?: string) => {
const toaster = inject(ToastrService);
toaster.warning(msg, title, {
easeTime: 1000
});
};


export const snackMsgError = (msg: string, title?: string) => {
const toaster = inject(ToastrService);
toaster.error(msg, title, {
easeTime: 1000
});
};

我得到了以下错误:

Error: Uncaught (in promise): Error: NG0203: inject() must be called from an injection context (a constructor, a factory function or a field initializer)

好吧...我之前遇到过一个问题,当时我尝试使用一个支持函数来获取路由参数:

export const routeParam$ = (key: string) => {
const activatedRoute = inject(ActivatedRoute);

return activatedRoute.params.pipe(
pluck(key),
filter(r => r !== null),
distinctUntilChanged()
);
};

而且我只能在带有 task: Observable<string> = routeParam$('task'); 的组件中用作字段初始化程序

好吧,错误消息非常清楚……但仍然……我是 angular14 的新手,我认为注入(inject)可以让我做到这一点。否则对我来说没那么有用。

现在我将其作为服务移动..

import {Injectable} from '@angular/core';
import {ToastrService} from 'ngx-toastr';

@Injectable({
providedIn: 'root'
})
export class MsgService {

constructor(private toaster: ToastrService) {
}

public snackMsgSuccess = (msg: string, title?: string) => {
this.toaster.success(msg, title, {
easeTime: 1000
});
};


public snackMsgInfo = (msg: string, title?: string) => {
this.toaster.info(msg, title, {
easeTime: 1000
});
};

public snackMsgWarn = (msg: string, title?: string) => {
this.toaster.warning(msg, title, {
easeTime: 1000
});
};


public snackMsgError = (msg: string, title?: string) => {
this.toaster.error(msg, title, {
easeTime: 1000
});
};
}

但这是实现它的唯一方法吗?即使在 angular14 中?

最佳答案

如答案中所述,它只能在 DI 系统实例化依赖项期间初始化。您可以通过创建高阶函数来解决此问题。

export const snackMsgSuccess = () => {
const toaster = inject(ToastrService);
return (msg: string,title?: string)=>{
toaster.success(msg, title, {
easeTime: 1000
});
}
};

component.ts

snackMsgSuccess = snackMsgSuccess();


ngOnInit(){
this.snackMsgSuccess('Success','Test');
}

更新 Angular 14.1

在此版本中,可以使用 runInContext API 在函数体内使用注入(inject)函数。

For More Info

关于angular - 正确理解 angular14 中的注入(inject) - 必须从注入(inject)上下文中调用 inject(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72511481/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com