【发布时间】:2019-09-18 09:29:47
【问题描述】:
我有一个页面,上面有多个表单。每个表单上都有许多按钮。我想在按下按钮后在按钮上实现加载微调器。当我使用正常的点击事件时,我可以传入按钮:
HTML
<button #cancelButton class="button-with-icon" type="button" *ngIf="hasCancel" mat-raised-button color="warn" [disabled]="isLoading" (click)="clickEvent(cancelButton)">
<mat-spinner *ngIf="isLoading" style="display: inline-block;" diameter="24"></mat-spinner>
Cancel
</button>
TS
clickEvent(button: MatButton) {
console.log(button);
}
在这种情况下,按钮元素被传递,您可以访问它以向按钮添加加载类。
但是,如果您使用提交按钮尝试相同的操作,它会显示为undefined:
HTML
<form (ngSubmit)="save(saveButton)">
<button #saveButton class="button-with-icon" type="submit" *ngIf="hasSave" mat-raised-button color="primary" [disabled]="isLoading">
<mat-spinner *ngIf="isLoading" style="display: inline-block;" diameter="24"></mat-spinner>
Save
</button>
</form>
TS
save(button: MatButton) {
console.log(button);
}
在这种情况下,按钮是undefined,因为按钮上的*ngIf 阻止了它进入表单的范围。我可以删除 *ngIf 并隐藏按钮,但这会将按钮留在 DOM 上,我不想这样做。
这里是堆栈闪电战:https://stackblitz.com/edit/angular-zh7jcw-mrqaok?file=app%2Fform-field-overview-example.html
我尝试向保存按钮添加一个额外的点击事件以将按钮设置为加载,但点击事件首先触发并将按钮设置为禁用,然后阻止调用提交事件。
我查看了提交事件,但看不到任何链接回单击按钮的内容。
有什么建议吗?
【问题讨论】:
-
首先...为什么需要像那样操作 dom(添加加载),有什么特殊原因吗?
-
保存和取消函数将异步调用到 Web 服务器。我想在处理异步调用时禁用按钮并在按钮上显示一个旋转图标。我正在制作一个动态表单组件。每个表单上可以有多个表单和多个按钮。因此,通过固定变量跟踪哪个按钮正在加载似乎比仅向按钮的 dom 中添加
loading类效率低。 -
好的,我明白了。有些人只是在简单的布尔标志就足够的情况下这样做,但我在这种情况下很好地理解了你的理由:)
-
@Curtis 我不确定您的效率问题是什么。关键是 Angular 通过将状态存储在组件而不是 DOM 中来做到这一点。它的代码更少,但性能却不低。
标签: javascript angular