工具提示在具有 ngFor 属性的标签内不起作用

Tooltip not working inside a tag with ngFor attribute

有人可以向我解释一下为什么使用 Angular 4 个模板的这段代码中的工具提示不起作用吗?

<template ngFor let-channel [ngForOf]="channels">
  <td>
    <em *ngFor="let color of findBallsColor()" class="fa fa-circle {{ color }}" [tooltip]="id"></em>
  </td>
</template>
<ng-template #id>
  test
</ng-template>

如果我删除 <em> 标签内的 *ngFor 它工作正常(显然只显示一个元素)。我是 Angular 的新手,所以我可能对它在这里的实际工作方式缺乏一些了解。

编辑

我发现问题出在 Typescript 函数的类型 returned 上。在上面的代码中,由 findBallsColor() 编辑的列表 return 实际上是一个包含 4 个字段的对象。当我将它更改为仅 return 一个字符串时,它就起作用了。所以代码看起来类似于:

HTML:

<template ngFor let-channel [ngForOf]="channels">
  <td>
    <em *ngFor="let color of findBallsColor()" class="fa fa-circle {{ status.color }}" [tooltip]="id"></em>
  </td>
</template>
<ng-template #id>
  test
</ng-template>

TS:

findBallsColor():any[] {
  return [{"statut":"ERROR","name":"name","otherField":"value","anotherField":"value"}];
}

有人知道这种行为的原因吗?

我遇到了类似的问题,这里是 this Github 问题的摘录,详细说明了您获取 *ngFor 数据的方式有什么问题。


从模板调用函数不是一个好的做法,这是存在此建议的一个示例。

当工具提示在第一种情况下触发时,它会启动一个 angular 检测循环,然后再次调用 items() 并尝试再次显示工具提示并启动另一个 angular 检测循环,不断重复。

起初,建议的存在是为了避免性能问题,但它会产生其他后果,就像您的情况一样。

如果你把 console.log 放在 items() 中,你会看到它一直被一次又一次地调用...

如果必须调用函数,请改用管道。


因此,在您的代码中,如果您使用管道或某种类型的可观察对象或数组,那么您的工具提示将起作用,但目前它只是不断调用该函数。

这对我有用 - 添加 data-toggle="tooltip" 到 html 标签 - 也就是工具提示。

然后通过主体 $('body').tooltip({selector: '[data-toggle="tooltip"]'});