【发布时间】:2020-01-30 02:23:58
【问题描述】:
背景
我使用的反应式表单扩展了两个选项卡(仅页面的前半部分有选项卡),然后是一个底部带有提交按钮的长页面。我在单击提交按钮时进行验证。
点击提交按钮,验证失败时页面需要滚动到错误表单域。
我还可以根据 FormGroups 中的错误加载选项卡。
问题
- 滚动发生在标签加载之前。
- 为了解决第 1 点,我订阅了 animationDone 事件,然后滚动到其中的点。
submit(){
//code to select the desired tab
this.selectedTab.animationDone.subscribe(res => {
this.myElement.nativeElement.ownerDocument.getElementsByClassName('ng-invalid mat-form-field')[0].scrollIntoView({ behavior: 'smooth' });
});
}
到目前为止一切正常!!!
单击“批准”按钮后,订阅即进行订阅,并且只要选择了新选项卡,页面就会滚动到错误处。我想取消订阅这个 observable,然后在再次点击提交按钮时重新订阅。
我尝试取消订阅,但无法再次订阅。这有时会破坏订阅函数并抛出错误
我想我错过了一些东西并寻求帮助。提前致谢!!
应要求提供更多代码
submit()
{
if(this.bookingForm.valid){
// do some actions ....
}
else {
this.bookingForm.markAllAsTouched();
//subscribing to the event before selecting the tab
this.selectedTab.animationDone.subscribe(res => {
this.myElement.nativeElement.ownerDocument.getElementsByClassName('ng-invalid mat-form-field')[0].scrollIntoView({ behavior: 'smooth' });
});
// code to select the Tab where the error occurs .....
this.selectedTab.selectedIndex = this.errorIndex;
//unsubscribe
this.selectedTab.animationDone.unsubscribe()
} // close of else block
}// close of submit Function
取消订阅(或类似功能)是必需的,因为它应该仅在单击提交按钮时订阅。如果它没有取消订阅(或暂停),那么每次更改选项卡时都会调用订阅函数,并且页面会根据错误不断上下滚动。
页面浏览量
编辑下面的 2
这里是StackBlitz Link。这只是一个示例页面,与此相比,我的页面有更多的字段和表单组。
重现问题
场景 1
- 填写字段 - Name , Tab1 , Details1
- 保持 tab1 处于选中状态并点击提交。
- 这应该向上滚动并显示 Tab2。按预期工作!延迟是可以接受的。
- 现在手动切换到 Tab1。
- 您可以看到页面滚动到 Details 2 字段。
- 每次切换标签时都会发生这种滚动。我该如何停止这种情况?
- 我可以通过在 app.component.ts 文件中取消注释第 38 行来实现这一点。 - 取消订阅命令。
- 在此,当我多次单击“提交”按钮时出现错误。
- 当我第二次点击时,订阅不起作用。
【问题讨论】:
-
您能在此处粘贴更多代码吗?我不确定这是否是实现您想要做的事情的正确方法。但是您可以使用
BehaviorSubject而不是Observable并在一定时间后使用next。 -
@SuyashGupta,我已经用更多细节更新了我的问题
-
你也可以分享你的html吗?
The scroll happens before the tab loads是什么意思? -
批准按钮上附加了哪些事件?它位于页面的什么位置?
-
我将在 stackBlitz 中重新创建我的问题并在此处分享链接。
标签: angular observable subscription