1

我有一个 list-group 定义为recipe-items的列表。我正在使用子路由,以便在用户单击列表元素时显示项目的描述。到目前为止,点击事件和路由正在工作,但我想将点击的项目标记为活动

recipe-list.component.html

<app-recipe-item 
  *ngFor="let recipeEl of recipes; let i = index" 
  [recipe]="recipeEl"
  [routerLink]="i"
  style="cursor: pointer;"
  >
</app-recipe-item>

为了做到这一点,我试图在我的嵌套中使用routerLinkActiveRecipeItemComponent指令,但看起来该指令超出了嵌套组件的范围。

recipe-item.component.html

<div class="list-group">
  <a 
    class="list-group-item list-group-item-action d-flex justify-content-between align-items-start"
    routerLinkActive="active"
    >
     TO BE MARKED AS ACTIVE WHEN CLICKED
  </a>
</div>

我错过了什么?即使使用localRef也无法在嵌套组件中检索其值。

4

2 回答 2

3

使用RouterLinkActive指令及其属性isActive

使用RouterLinkActive和 本地引用可以将 的值传递isActive给嵌套组件的@Input()属性,以便在其模板中使用它来触发ngClass

食谱列表.component.html

 <app-recipe-item 
  *ngFor="let recipeEl of recipes; let i = index" 
  [recipe]="recipeEl"
  [routerLink]="i"
  routerLinkActive
  #rla="routerLinkActive"
  [currentlySelected]="rla.isActive"
  style="cursor: pointer;"
  >
</app-recipe-item>

配方-item.component.ts

@Component({
  selector: 'app-recipe-item',
  templateUrl: './recipe-item.component.html',
  styleUrls: ['./recipe-item.component.css']
})
export class RecipeItemComponent implements OnInit {
  @Input() recipe: Recipe;
  @Input() currentlySelected: boolean;

配方-item.component.html

...
<a [ngClass]="{active: currentlySelected}">
...
于 2018-05-11T13:21:28.680 回答
1

routerLinkActive指令通过订阅路由器的导航事件向活动链接添加特殊样式,请参阅源代码

您也可以在app-recipe-item组件中执行相同操作,而无需使用 routerLinkActive 指令。(代码相同)


另一种方式,routerLinkActive提供一个isActive属性来显示当前 routerLink 是否处于活动状态。您也可以将其作为组件注入,以检索其值并更改为活动样式。

<app-recipe-item 
  *ngFor="let recipeEl of recipes; 
  let i = index" [recipe]="recipeEl" 
  [routerLink]="i" style="cursor: pointer;"
  routerLinkActive
>
</app-recipe-item>

constructor(
  @Inject(RouterLinkActive) private activeRouter: RouterLinkActive  // inject
) { }

<a class="list-group-item list-group-item-action d-flex justify-content-between align-items-start"
  [ngClass]="{active: activeRouter.isActive}"
>
  TO BE MARKED AS ACTIVE WHEN CLICKED
</a>

参考演示

于 2018-05-04T18:21:57.757 回答