生成的HTML如下:-
<span (click)="triggerClick()" data-link-id="960" data-link="8" class="level_modal">individuals</span>
triggerClick()函数在ts文件中定义,但是使用动态生成的html代码时没有触发该函数。
<span (click)="triggerClick()" data-link-id="960" data-link="8" class="level_modal">individuals</span>
triggerClick()函数在ts文件中定义,但是使用动态生成的html代码时没有触发该函数。
这样不行。你用来编写Angular模板的语言并不是HTML,而是一种自定义的Angular语法,它有意地看起来像HTML,以便更好地编写代码。然后这些模板被编译成高度优化的JavaScript函数。
你从API获取的字符串是在应用程序运行时接收到的,这意味着Angular的编译器已经完成了它的工作(它已经编译了代码,这就是为什么你可以运行你的应用程序)。此时,默认情况下无法再使用Angular的编译器。将编译器包含在应用程序的最终捆绑包中会导致性能问题,因为编译器代码具有较大的大小占用。这就是为什么AOT编译(提前编译)是发布Angular应用程序的默认和推荐方式的原因。
你的API根本不应该返回HTML。单页应用程序(SPA)背后的整个思想是让它们消耗一个与语言和平台无关的API。它只是使用数据,今天的数据通常使用JSON符号编码。这是API应该理解的唯一语言。
从你在这里发布的代码示例中我可以看出,你对这种形式的数据感兴趣:
{ linkId: 960,
link: 8,
text: individuals }
<span *ngFor="let item of items"
(click)="triggerClick()"
[attr.data-link-id]="item.linkId"
[attr.data-link]="item.link"
class="level_modal">
{{ item.text }}
</span>
当然,你可能并不需要所有这些data-
属性。这是因为Angular应用程序应该专注于模型。模型是真相的源泉,用于创建模板。如果您需要有关每个项目的其他信息(例如link
和linkId
),只需将其保存在内存中作为对象即可。无需将其编码到HTML中以便稍后再次阅读。
时
(click)="doSomething()"
你想说的是:
当我点击这个时,启动 doSomething 方法
但实际上你所说的是:
请 Angular 编译这段代码,以便当我点击这个时,启动 doSomething 方法
因为你可能知道,你正在编写 Typescript,而不是 Javascript。因此,你的代码将被编译为服务,从而将其转换为:
onclick="doSomething()"
当您编译代码时,实际上会进行缩小和混淆。因此,这将为您提供类似以下内容的东西
onclick="a()"
因此,使您失去了对此的任何逻辑。
解决方案是将点击事件绑定到全局函数。有两种方法可以做到这一点:
我将解释第一种用例,对于第二种用例,我会简单介绍:创建一个JS文件作为资产,将您的函数放入其中,并在单击时调用它。
对于第二个问题,有点棘手。
首先,在您的组件中注入ngZone:这允许您处理Angular之外的代码。
constructor(private zone: NgZone) {}
然后,创建一个全局函数(我将使用TypeScript并符合linting规范)
ngOnInit() {
this.zone.run(() => {
window['doSomething'] = () => {
console.log('Look mom, I did something !');
};
});
}
ngOnDestroy() { delete(window['doSomething']); }
(click)="doSomething()"
To this
onclick="window.doSomething()"