Angular 8 - 遍历对象数组时,点击事件不会在 ngFor 内部触发

Angular 8 - click event not firing inside ngFor when iterating over object arrays

注意:编辑原始 post 以删除实施 details/complexity。

我有一个调用服务方法的 ngFor 循环。方法 returns 一个由 for 循环迭代的数组。

如果返回的数组是对象数组,则点击事件绑定不起作用。如果数组是原始类型,它确实有效。

***contextmenu/right-click 在任何一种情况下都有效,所以这会影响点击而不是上下文菜单

***在此之前和之后的点击事件按预期工作

***即使我将硬编码方法从服务移动到组件,行为也是一样的

这是上下文中的 for 循环:

<div><span (click)="addVariable()"></span></div> <!-- works -->

<div *ngFor="let variable of designerService.getVariables();" (click)="onLeftClick()" (contextmenu)="onRightClick()">just a simple div</div> <!-- doesnt work -->

<div><span (click)="addVariable()"></span></div> <!-- works -->
public addVariable() {
  alert("add variable");
}

public onLeftClick() {
  alert("left click");
}

public onRightClick() {
  alert("right click");
}

使用此实现(或任何其他对象类型数组)将不会单击 work/fire:

public getVariables(): {name: string}[] {
  return [{"name": "dog"},{"name": "cat"},{"name": "bird"},{"name":"bear"}];
}

通过此实现,点击将起作用:

public getVariables(): number[] {
  return [1,2,3,4,5];
}

超级简单,行不通...

对可能出现的问题有什么想法吗? Angular 此时我已无计可施了。

试试这个:

// YourComponent ts file
variables: {name: string}[];

constructor(public designerService: DesignerService) { }

ngOnInit() {
  this.variables = this.designerService.getVariables();
}

// Other methods
<!-- HTML template file -->
<!-- Replace the designerService.getVariables() method call with component property 'variables' -->
<div *ngFor="let variable of variables" (click)="onLeftClick()" 
(contextmenu)="onRightClick()">works</div> <!-- works -->

应用程序中可能有一些代码触发了更改检测,这导致 re-rendering 甚至在关联的点击处理程序执行之前就出现了问题。

仅出于测试目的,在进行上述建议的更改之前,您还可以尝试在服务 class 中定义数组 属性,然后 return 来自 [=13] 的数组=],观察是否解决问题。

// DesignerService ts file
someArray = [{"name": "dog"},{"name": "cat"},{"name": "bird"},{"name":"bear"}];

public getVariables(): {name: string}[] {
  return this.someArray;
}