我正在使用这个tutorial来拥有一个定制的上下文菜单. 我正在显示列表中的项目,我希望当用户单击这些项目时,会显示它们的索引.目前,右击任何项目都会显示最后一个索引,例如,如果我的列表有3个项目,则点击任何项目都会显示2! 我如何才能显示每一项的正确索引?
以下是我的代码:
<div *ngFor="let item of items; let i = index" (contextmenu)="displayContextMenu($event); false">
<span> {{item}}</span>
<app-context-menu
*ngIf="rightClickMenuItems.length > 0 && isDisplayContextMenu"
[ngStyle]="getRightClickMenuStyle()"
[contextMenuItems]="rightClickMenuItems"
(onContextMenuItemClick)="handleMenuItemClick($event, i)"
></app-context-menu>
</div>
TS文件:
items = ["item0","item1","item2"];
isDisplayContextMenu!: boolean;
rightClickMenuItems: Array<ContextMenu> = [];
rightClickMenuPositionX!: number;
rightClickMenuPositionY!: number;
displayContextMenu(event: any) {
this.isDisplayContextMenu = true;
this.rightClickMenuItems = [
{
menuText: 'Print index',
menuEvent: 'Handle print index',
},
];
this.rightClickMenuPositionX = event.clientX;
this.rightClickMenuPositionY = event.clientY;
}
handleMenuItemClick(event: any, index: number) {
switch (event.data) {
case this.rightClickMenuItems[0].menuEvent:
this.printIndex(index);
break;
}
}
printIndex(index: number){
alert(index);
}
@HostListener('document:click')
documentClick(): void {
this.isDisplayContextMenu = false;
}
getRightClickMenuStyle() {
return {
position: 'fixed',
left: `${this.rightClickMenuPositionX}px`,
top: `${this.rightClickMenuPositionY}px`
}
}
上下文菜单组件:
.html:
<ng-container>
<div>
<div *ngFor="let menuItem of contextMenuItems; index as i"
(click)="onContextMenuClick($event, menuItem.menuEvent)">
{{ menuItem.menuText }}
</div>
</div>
</ng-container>
.ts
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { ContextMenu } from '../../_models/contextMenu.model';
import { NgIf, NgFor } from '@angular/common';
@Component({
selector: 'app-context-menu',
templateUrl: './context-menu.component.html',
styleUrls: ['./context-menu.component.css'],
standalone: true,
imports: [NgIf, NgFor]
})
export class ContextMenuComponent {
@Input() contextMenuItems!: Array<ContextMenu>;
@Output() onContextMenuItemClick: EventEmitter<any> = new EventEmitter<any>();
onContextMenuClick(event: any, data: any): any {
this.onContextMenuItemClick.emit({
event,
data,
});
}
}
型号:
export interface ContextMenu {
menuText: any;
menuEvent: any;
}