【问题标题】:Passing Routerlink to child component将Routerlink传递给子组件
【发布时间】:2019-04-12 04:26:51
【问题描述】:

我在我的共享模块中创建了一个组件,它是标题组件,所以在我的所有组件中我都想调用它。

在我的共享组件中,我们称之为 app-header 组件,我想接​​受输入 Title: string, buttonName: string 和 buttonLink: any (因为我很困惑) 我的组件:

import { Component, OnInit, Input } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-app-header',
  templateUrl: './app-header.component.html',
  styleUrls: ['./app-header.component.less']
})
export class AppHeaderComponent implements OnInit {
    @Input() title: string;
    @Input() buttonName: string; 
    @Input() buttonLink: any;

  constructor() { }

  ngOnInit() {
  }

}

我的 app.header.html

<div class='row border-bottom my-4 align-middle apptitle'>
    <div class="col-8 my-2">
      <div>
        <h3> {{title}}</h3>
      </div>
    </div>
    <div class="col-4 my-2 text-right">
      <button class="btn btn-primary pull-right" [routerLink]={{buttonLink}}>{{buttonName}}</button>
    </div>
  </div>

我通过在我的其他组件中使用这个组件:

我的共享模块:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedComponent } from './shared.component';
import { AppHeaderComponent } from './app-header/app-header.component';

@NgModule({
  imports: [
    CommonModule,
  ],
  providers: [],
  declarations: [
      SharedComponent, 
    AppHeaderComponent],
  exports:[
      AppHeaderComponent,
  ]
})
export class SharedModule { }

我的问题是我不知道如何传递链接,因此 routerlink 将起作用。 知道如何以正确的方式传递链接/路由器链接吗?路由属于调用它的组件的模块。

我有许多延迟加载的模块将使用这个共享组件。所以我猜路由应该能够从它的调用者组件模块重定向/调用链接。

已编辑:添加更多信息

共享模块:AppHeaderComponent(这没有路由)

AdminModule: AdminComponent -> 在里面调用AppHeaderComponent(AdminModule有Routes)

UserMoudule: UserComponent -> 在里面调用AppHeaderComponent(UserModule有Routes)

我需要 AppHeaderComponent 链接到正确的 routeLink。

示例: 在用户组件中:

<app-app-header
    [title]= "'Users'"
    [buttonName]="'Create New'"
    [buttonLink]="['/user/create']"
></app-app-header>

【问题讨论】:

  • 您的HeaderComponent 中是否只有一个链接?还是您要在这里创建的HeaderLinkComponent?并且您想使用HeaderComponent 本身创建多个?
  • 请同时添加您在模板中使用AppHeaderComponent 的具体实现方式。
  • 我添加了上面的用法。 UserModule 中的用户,SharedModule 中的 AppHeaderComponent。

标签: angular angular6 angular7


【解决方案1】:

我认为您需要稍微更改您的代码。您需要使用另一种结构来传递您的链接。 [routerLink]="buttonLink".

有关模板表达式和插值的更多信息,您可以阅读official documentation of angular

【讨论】:

  • hmm 但我认为它仍然无法工作,因为这个模块没有路由。而不同模块中的调用者组件(它有路由)
【解决方案2】:

要使路由在您的SharedModule 中起作用,您还必须将RouterModule 添加到您的imports 数组中。

...
import { RouterModule } from '@angular/router';

@NgModule({
  imports: [
    CommonModule,
    RouterModule
  ],
  ...
})
export class SharedModule {}

另外,在您的HeaderComponent 中,您需要修复routerLink 分配:

...
<button 
  class="btn btn-primary pull-right" 
  [routerLink]="buttonLink">
  {{buttonName}}
</button>
...

你应该像这样使用这个组件(没有[]):

<app-app-header 
  [title]="'Organisations'" 
  [buttonName]="'Create New'" 
  [buttonLink]="'/admin/user/create'">
</app-app-header>

【讨论】:

  • 我添加了上面的用法。 UserModule 中的用户,SharedModule 中的 AppHeaderComponent。因此,如果我在 AppHeaderComponent 中调用 /admin/user/create ,它将重定向到 home 或 / 因为它不知道路由。路由在用户模块中。
  • 是的,我正在使用延迟加载模块。 Admin/User 模块有路由。有用。但我需要从我的 SharedModule 组件中调用这些路由。我创建应用程序标头组件只是为了简化我的应用程序。
  • 好吧,我解释一下:我希望我的所有组件都有相同的标题,所以如果有一天客户想要更改标题,它将在所有组件上实现。但那里有一个按钮创建新数据。例如:User => Create New User(UserModules 有用于 user/create 的路由,但共享模块不知道它是否正确)。
  • 我明白了。但我的问题是,为什么将链接和链接文本作为@Input 属性传递。如果您传递了这些,并且有多个链接,那么您也不会在模板上呈现这些链接时使用*ngFor 来循环这些链接。那么为什么不简单地将它们硬编码到您的 HeaderComponent 模板中呢?
  • 除非您共享您的路由器配置实现,否则很难理解为什么 routeLink 将用户带到 /home/ 而不是指定的路径。它与某些模块是否具有路由而某些模块没有无关。它也与您的 SharedModule 不包含任何 routes 无关。
猜你喜欢
  • 2018-03-06
  • 2017-12-02
  • 2017-12-26
  • 2020-01-14
  • 1970-01-01
  • 2022-11-30
  • 2017-03-22
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多