如何覆盖 Angular 中的现有组件?

ann*_*len 8 components selector angular angular5

我正在尝试覆盖角度中的现有组件。

我原来的组件是:

@Component({
  selector: 'app-orginal',
  templateUrl: './orginal.component.html',
  styleUrls: ['./orginal.component.css']
})
export class OrginalComponent implements OnInit {
}
Run Code Online (Sandbox Code Playgroud)

在 app.component.html 中我使用原始组件,如下所示:

<app-orginal></app-orginal>
Run Code Online (Sandbox Code Playgroud)

您想要做的是用模拟组件覆盖原始组件。

这是我的模拟组件:

@Component({
  selector: 'app-mock-of-orginal',
  templateUrl: './mock-of-orginal.component.html',
  styleUrls: ['./mock-of-orginal.component.css']
})
export class MockOfOrginalComponent implements OnInit {
}
Run Code Online (Sandbox Code Playgroud)

与此答案相关/sf/answers/3452939871/我尝试在我的 app.module.ts 中使用此解决方案:

@NgModule({
    declarations: [
        AppComponent,
        OrginalComponent,
        MockOfOrginalComponent
    ],
    imports: [
        BrowserModule,
        HttpClientModule,
        RouterModule.forRoot([
            {path: 'app-mock-of-orginal', component: MockOfOrginalComponent},
            {path: 'app-orginal', redirectTo: 'app-mock-of-orginal', pathMatch: 'full'},
        ]),
    ],
    providers: [],
    bootstrap: [AppComponent]
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我做错了什么?

这是我的 git-hub 项目:https ://github.com/annalen/overwrite-component

谢谢您的帮助。

Rea*_*lar 4

要用替代组件替换组件,它必须替换原始组件的声明。您的示例是同时声明两个组件,但使用不同的选择器。关键是使用相同的选择器,但只声明一个。

@Component({selector: 'app-original'})
export class MockAppComponent {
      // this will replace AppComponent
}

@Component({selector: 'app-original'})
export class AppComponent {
}

// You could use a value from environment.ts
// if you need to toggle this at compile time.
const mockFlag = true;

@NgModule({
    declarations: [
       mockFlag ? MockAppComponent : AppComponent,
    ],
    imports: [
        BrowserModule,
        HttpClientModule,
        RouterModule.forRoot([]),
    ],
    providers: [],
    bootstrap: [mockFlag ? MockAppComponent : AppComponent]
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)

Angular 不允许您声明共享同一选择器的两个组件,但如果您不想更改模板,则必须使用该选择器。

我不确定你为什么要这样做。也许这不是你所需要的。

  • 只是想知道“MockAppComponent”是否可以实现/扩展“AppComponent”,然后覆盖一些功能? (2认同)