1) 我建议您使用延迟加载的模块而不是动态 css 文件(请查看official Angular docs 了解更多信息)
2)我还建议将当前语言放入某些服务,将服务注入适当的组件并使用所需的 css 类。优点:
2.1) 组件样式不依赖于 body 元素 - 只依赖于服务价值 - 这对于单元测试来说更好/更正确
2.2) 可能存在使用 LTR 与 RTL 类还不够的用例,而是为特定语言使用一些额外的类(例如,对于英语、德语等语言,表格列可能具有不同的宽度)
3) 动态加载 css 可能会导致 UI 问题:首先应用初始样式,然后它们“跳转”到“其他”样式(当加载适当的 css 文件时)。所以 1) & 2) 更好(恕我直言)
2017-06-07 更新(只是为了更清楚)
app-routing.module 可能是这样的:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
export const routes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full'},
{
path: 'home',
loadChildren: 'app/my-home-page/my-home-page.module#MyHomePageModule'
},
...
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
my-global.service 可能是这样的:
@Injectable()
export class MyGlobalService {
currentLanguageDirection: string; // i.e. 'ltr' or 'rtl'
currentLanguage: string; // i.e. 'en', 'de', 'ru', etc
}
my-home-page.component.ts 可能是:
export class MyHomePageComponent {
...
constructor(
private myGlobalService: MyGlobalService, // inject global service
...
) {
}
...
}
my-home-page.component.html 可以是:
<div [ngSwitch]="myGlobalService.currentLanguageDirection">
<my-home-page-rtl *ngSwitchCase="'rtl'"></my-home-page-rtl>
<my-home-page-ltr *ngSwitchDefault></my-home-page-ltr>
</div>
即可以使用两个附加组件:my-home-page-ltr 和 my-home-page-rtl。它们会有单独的 scss|css 文件。
如果您需要德语的独特实现,那么 my-home-page-ltr.component.html 可以是:
<div [ngSwitch]="myGlobalService.currentLanguage">
<my-home-page-ltr-de *ngSwitchCase="'de'"></my-home-page-ltr-de>
<div *ngSwitchDefault>
... (default html code)
</div>
</div>
即单独的 my-home-page-ltr-de 组件将具有单独的德语 scss|css。
附:请注意,您可以通过在@Component 中设置 html 文件来重用它们:
@Component({
selector: 'my-home-page...',
templateUrl: './my-home-page....html', // <-------------- reuse here
styleUrls: ['./my-home-page....scss']
})
附言我建议不要使用手动创建/删除组件。 ngSwitch 或 ngIf 的使用是更正确的方法(恕我直言)
P.P.P.S.优点如下。组件及其子组件应由 angular 自动加载/释放。语言切换将执行得非常快,因为当前组件加载了它的子组件 - 您不需要在语言切换期间加载所有组件的样式。