[英]Angular injector on extended components
我正在使用ionic4和Angular 7.2.2,我创建了一个基本组件类,可以被其他组件扩展,而不必重复我经常使用的很多东西。 为了避免构造函数注入,因此强制将params再次传递给扩展类中的基础construtor,我使用的是Injector.get。
体验的问题是,当以这种方式使用它时,如果在子构造函数中注入,很多Angular或Ionic注入器工作正常,使用父项的引用时,在子项中使用时不起作用或返回空值。
我确信我错过了一些东西,因为在使用我的基类中的一个和来自孩子的那个时检查注射器时,它们是不同的。
Uppon执行,并转到: http:// localhost:8101 / home / 4
这是相关代码:
APP-routing.module.ts
const routes: Routes = [
{path: '', redirectTo: 'home/4', pathMatch: 'full'},
{path: 'home/:id', loadChildren: './home/home.module#HomePageModule'},
];
home.page.ts
import {Component} from '@angular/core';
import {BasePage} from '../../tests/base.comp.test';
import {ActivatedRoute} from '@angular/router';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage extends BasePage {
constructor(public ar: ActivatedRoute) {
super();
this.activatedRoute.params.subscribe(
(result) => {
console.log(`PARAMS FROM inherited activatedRoute-> `, result); // -> outputs {} WRONG!
}
);
ar.params.subscribe(
(result) => {
console.log(`Params from direct injection-> `, result); // -> outputs {id: "4"} Good!
}
);
}
}
home.module.ts
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import {HomePage} from './home.page';
import {BasePageModule} from '../../tests/base.test.module';
@NgModule({
imports: [
BasePageModule,
RouterModule.forChild([
{
path: '',
component: HomePage
}
])
],
declarations: [HomePage]
})
export class HomePageModule {
}
base.test.module.ts
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {IonicModule} from '@ionic/angular';
import {FormsModule} from '@angular/forms';
import {BasePage} from './base.comp.test';
@NgModule({
imports: [
CommonModule,
IonicModule,
FormsModule,
],
declarations: [BasePage],
providers: [],
exports: [
CommonModule,
IonicModule,
FormsModule
]
})
export class BasePageModule {
}
base.comp.test.ts
import {Component, Injector} from '@angular/core';
import {AppInjectorTest} from './app.injector.test';
import {ActivatedRoute, Router} from '@angular/router';
@Component({
selector: 'app-base',
template: '',
})
export class BasePage {
public injector: Injector;
public activatedRoute: ActivatedRoute;
constructor() {
const injector = AppInjectorTest.getInjector();
this.activatedRoute = injector.get(ActivatedRoute);
}
}
app.injector.test.ts
import {Injector} from '@angular/core';
export class AppInjectorTest {
private static injector: Injector;
static setInjector(injector: Injector) {
AppInjectorTest.injector = injector;
}
static getInjector(): Injector {
return AppInjectorTest.injector;
}
}
app.component.ts
import {Component, Injector} from '@angular/core';
import {Platform} from '@ionic/angular';
import {SplashScreen} from '@ionic-native/splash-screen/ngx';
import {StatusBar} from '@ionic-native/status-bar/ngx';
import {AppInjectorTest} from '../tests/app.injector.test';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar,
private injector: Injector
) {
this.initializeApp();
AppInjectorTest.setInjector(injector);
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
});
}
}
目前看来,我们想要做的唯一解决方法是将注射器从子进程重新注入父进程。 它不像保持构造函数完全为空一样干净,但至少,你可以以一种简洁的方式扩展和重用父组件中的大量逻辑。
child.comp.ts(从父级扩展)
constructor(public injector: Injector) {
super(injector);
}
(...)
parent.comp.ts
(...)
constructor(public injector: Injector) {
this.activatedRoute = injector.get(ActivatedRoute);
}
(...)
静态注入器没有任何问题,但它与activateRoute的工作方式有关, ActivatedRoute包含有关与组件关联的路由的信息。 装入插座 doc ,thay whay注入的激活路由器(组件)工作instad的基础注入activatedrouteservice
当使用以组件为目标的参数化路由时,只有该组件可以访问这些参数。
检查这个问题有类似的问题👉 如何使用Injector.get(ActivatedRoute)检索路由参数?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.