如何根据我运行的项目更改组件中的文本?
How to change text in the component base on the project I runs?
我在我的 nx monorepo 中构建 auth
库。
auth
库包含 LoginComponent
(智能)和 LoginFormComponent
(愚蠢)。
并且我通过使用 loadChildren
加载 auth.module
来延迟加载库,并且在这个模块中我有一个到 LoginComponent
的子路由,它有 LoginFormComponent
。
在 LoginFormComponent
我有文本:“登录到我很棒的应用程序”。
<h1>Login to my awesome app</h1>
<form...>
问题是当我想添加另一个 angular 应用程序并使用此身份验证组件和功能时。
因此,当我使用新应用程序的身份验证时,我收到文本:“登录到我很棒的应用程序”。
对于现有的应用程序,文本应该是:“登录到我很棒的应用程序”。
对于新应用应该是:“登录到 ng 应用”。
我只有一个 auth
库和其中一个登录组件。
所以我正在寻找 angular 方法来处理这种情况。
我曾考虑复制组件,但感觉不对。或者使用 i18n 但不确定,因为它用于语言,或者使用 forRoot
并通过文本传递提供者?将令牌与注入一起使用?
我可以通过哪些方式更改文本?如何处理这个问题? angular 是这个 senario 的解决方案吗?
我能理解你的情况。这是你应该做的。我假设您已经在 nx
monorepo 下创建了一个 @shared/auth
库。 auth
库包含 LoginFormComponent
.
您应该利用 ForRoot
和 @Inject()
来实现相同的目的。
auth.module.ts
@NgModule({
// all imports etc
})
export class AuthModule {
static forRoot(appName: string): ModuleWithProviders<AuthModule> {
return {
ngModule: AuthModule,
providers: [
{ provide: APP_NAME, useValue: appName }
],
};
}
}
为避免在导入时出现任何循环依赖性 APP_NAME
,创建一个文件
config.ts
export const APP_NAME = new InjectionToken<string>('APP_NAME_PARAM');
开始你的LoginFormComponent
LoginFormComponent.component.ts
export class LoginFormComponent{
public appName: string;
constructor(@Inject(APP_NAME) clientAppName: string){
this.appName = clientAppName;
}
}
login.component.html
<h1>Login to {{appName}} app</h1>
现在,我们都准备好了。唯一剩下要做的就是在我们的 app.module.ts
中使用 AuthModule
app.module.ts
@NgModule({
imports: [
AuthModule.forRoot("Super Awesome")
]
})
export class AppModule
这也可以帮助您在其他应用中重复使用 AuthModule
。您只需要为每个应用程序库创建一个 constant
文件,然后将 Super Awesome
移动到该常量中以获得更好的可读性。
它可能不完全相关,但是,您可以查看 this article for more understanding of ForRoot and InjectionToken
我在我的 Nx monorepo 项目中广泛使用了它。这是一种标准方式。
我在我的 nx monorepo 中构建 auth
库。
auth
库包含 LoginComponent
(智能)和 LoginFormComponent
(愚蠢)。
并且我通过使用 loadChildren
加载 auth.module
来延迟加载库,并且在这个模块中我有一个到 LoginComponent
的子路由,它有 LoginFormComponent
。
在 LoginFormComponent
我有文本:“登录到我很棒的应用程序”。
<h1>Login to my awesome app</h1>
<form...>
问题是当我想添加另一个 angular 应用程序并使用此身份验证组件和功能时。
因此,当我使用新应用程序的身份验证时,我收到文本:“登录到我很棒的应用程序”。
对于现有的应用程序,文本应该是:“登录到我很棒的应用程序”。
对于新应用应该是:“登录到 ng 应用”。
我只有一个 auth
库和其中一个登录组件。
所以我正在寻找 angular 方法来处理这种情况。
我曾考虑复制组件,但感觉不对。或者使用 i18n 但不确定,因为它用于语言,或者使用 forRoot
并通过文本传递提供者?将令牌与注入一起使用?
我可以通过哪些方式更改文本?如何处理这个问题? angular 是这个 senario 的解决方案吗?
我能理解你的情况。这是你应该做的。我假设您已经在 nx
monorepo 下创建了一个 @shared/auth
库。 auth
库包含 LoginFormComponent
.
您应该利用 ForRoot
和 @Inject()
来实现相同的目的。
auth.module.ts
@NgModule({
// all imports etc
})
export class AuthModule {
static forRoot(appName: string): ModuleWithProviders<AuthModule> {
return {
ngModule: AuthModule,
providers: [
{ provide: APP_NAME, useValue: appName }
],
};
}
}
为避免在导入时出现任何循环依赖性 APP_NAME
,创建一个文件
config.ts
export const APP_NAME = new InjectionToken<string>('APP_NAME_PARAM');
开始你的LoginFormComponent
LoginFormComponent.component.ts
export class LoginFormComponent{
public appName: string;
constructor(@Inject(APP_NAME) clientAppName: string){
this.appName = clientAppName;
}
}
login.component.html
<h1>Login to {{appName}} app</h1>
现在,我们都准备好了。唯一剩下要做的就是在我们的 app.module.ts
AuthModule
app.module.ts
@NgModule({
imports: [
AuthModule.forRoot("Super Awesome")
]
})
export class AppModule
这也可以帮助您在其他应用中重复使用 AuthModule
。您只需要为每个应用程序库创建一个 constant
文件,然后将 Super Awesome
移动到该常量中以获得更好的可读性。
它可能不完全相关,但是,您可以查看 this article for more understanding of ForRoot and InjectionToken
我在我的 Nx monorepo 项目中广泛使用了它。这是一种标准方式。