angular - 第二个 ngb-tab 中的模板驱动表单验证
问题描述
我在ngb-tab
.
我想订阅我的表单的有效性更改,该表单位于 ngb-tab 中,如下所示:
<ngb-tab title="someTitle" id="tab-other">
<ng-template ngbTabContent>
<form class="animated fadeIn" #tranferInitForm="ngForm">
...
<div class="input-group">
<input name="benName" type="text" class="form-control" id="benName" #benName='ngModel'
[(ngModel)]="options.benName" required [pattern]="inputPattern" maxlength="70">
<label>some label</label>
</div>
...
<button class="btn btn-primary"
[disabled]="!tranferInitForm.valid"
(click)="onClick()">next step</button>
</div>
</div>
</form>
并检查按钮内输入的有效性[disabled]="!tranferInitForm.valid"
这应该足够了吗?
之后我尝试添加我的组件:
@ViewChild('tranferInitForm', { static: true }) tranferInitForm;
ngOnInit() {
this.tranferInitForm.statusChanges.subscribe(validity => {
switch (validity) {
case 'VALID':
if (this._formValid) { return; }
this._formValid = true;
break;
case 'INVALID':
if (!this._formValid) { return; }
this._formValid = false;
break;
}
});
}
在第一次运行时会引发错误
错误类型错误:无法读取未定义的属性“statusChanges”
但在那之后工作。我想是因为表单在选项卡内。
有任何想法吗?
感谢您的时间
解决方案
问题是因为加载组件时未显示选项卡内容,这会导致未定义的模板引用。您需要将静态标志设置为 false 以对视图子元素进行动态查询,并等到表单选项卡变为活动状态才能访问它的引用。
有两种方法可以实现这一点:
1/ 简单的方法是使用响应式 from,这样您就可以在创建表单后实现所需的逻辑。
2/ 收听 tabChange 事件并检查 nextId 是否是您的表单选项卡 ID(在您的情况下为 tab-other),然后在延迟一段时间后访问表单引用,因为 tabChange 事件在选项卡更改发生之前发出:
html
<ngb-tabset (tabChange)="onTabChange($event)">
ts
...
订阅:订阅;
...
onTabChange(event) {
if (event.nextId === "tab-other" && !this.subscription) {
setTimeout(() => {
this.subscription = this.tranferInitForm.statusChanges.subscribe(
validity => {
switch (validity) {
case "VALID":
if (this._formValid) {
return;
}
this._formValid = true;
break;
case "INVALID":
if (!this._formValid) {
return;
}
this._formValid = false;
break;
}
}
);
}, 100);
}
}
推荐阅读
- terraform - 使用模块无法从 terraform_remote_state 获取 vpc_id 以用于其他模块
- data-structures - 有人可以从 Judy 数据结构文档中解释这一行吗?
- automapper - 自动映射到多个子类型
- c# - Microsoft Graph 无效筛选子句
- json - JQ 根据条件删除条目
- sql - 试图找出 OPENJSON 查询的语法并卡住了
- android - CoordinatorLayout 中的 RecyclerView 在数据更改时滚动到顶部
- javascript - 将 React 应用程序的一部分弹出到新窗口中
- winapi - DeviceIoRequest 获取用于 USB 存储的 STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR 失败
- java - 当为 Junit 测试设置 Id 时为 id 获取 null