当用户点击按钮进入下一页时,如果页面部分填写但不合法,则阻止用户继续并显示错误指示器。
在模板驱动表单中,我有几个容器元素使用
我创建了一个类来保存关于页面的信息。
为了得到名为“pg”+当前页码加1(加1以匹配视图,因为数组从0开始)的单独的
回到模板,要在标签或页面上显示错误指示器,我只需要检查
在模板驱动表单中,我有几个容器元素使用
NgModelGroup
属性来表示表单中的“页面”。在我的组件中,我想引用这个集合,以便我可以通过索引访问它们。由于我无法获取这个集合(@AJT_82 在下面评论了原因),这是我的方法:我创建了一个类来保存关于页面的信息。
export class Page
{
title: string;
hasError: boolean; //should the page display an error indicator
}
在我的组件中,我在ngOnInit中填充一个数组pages: Page[]
ngOnInit()
{
this.pages = [{title: "Page 1", hasError: false},
{title: "Page 2", hasError: false},
{title: "Page 3", hasError: false}]
}
在她的回答中,@DeborahK 给了我
this.form.form.get('pg1'))
为了得到名为“pg”+当前页码加1(加1以匹配视图,因为数组从0开始)的单独的
ngModelGroup
,我可以在点击事件中使用它,该事件将导致A)进入下一页或B)将hasError
属性设置为true并不进入下一页。let p = this.form.form.get("pg"+ (this.currentPg+1));
//if the page is partially filled out but not valid
if(p.invalid && p.dirty)
this.pages[this.currentPg].hasError = true;
else
{
//even if it's false, re-false it ;)
this.pages[this.currentPg].hasError = false;
//continue to next page.
//i.e. this.currentPg++ or this.currentPg--
}
回到模板,要在标签或页面上显示错误指示器,我只需要检查
pages[currentPg].hasError
属性。为了样式化标签,给标签元素分配“has-error”类。<div id="tabs">
<a *ngFor="let p of pages"
[ngClass]="(p.hasError ? ' has-error' : '')"><p>{{p.title}}</p></a>
</div>
<form #f="ngForm">
<div ngModelGroup="pg1"> <!-- pages[0] -->
<div id="errorBlock" *ngIf="pages[currentPg].hasError">
You had an error.
</div>
<div>
<input ngModel/>
<input ngModel/>
</div>
<div>
<input ngModel/>
<input ngModel/>
</div>
</div>
<div ngModelGroup="pg2"> <!-- pages[1] -->
<input ngModel/>
</div>
</form>
这是示例组件:
...
currentPg: number = 0;
pages: Page[] = [];
@ViewChild('f') public form: NgForm;
ngOnInit()
{
this.pages = [{title: "Page 1", hasError: false},
{title: "Page 2", hasError: false},
{title: "Page 3", hasError: false}]
}
NextPage()
{
let p = this.form.form.get("pg"+ (this.currentPg+1));
//if the page is partially filled out but not valid
if(p.invalid && p.dirty)
this.pages[this.currentPg].hasError = true;
else
{
//even if it's false, re-false it ;)
this.pages[this.currentPg].hasError = false;
//Do navigation logic.
//i.e. this.currentPg++ or this.currentPg--
}
}
如果有一种方法可以获取ngModelGroups的集合并像数组一样使用它,那么很多问题都可以解决。
@ViewChild('f')
是什么?this.tabs
是什么? - Max KoretskyingAfterViewChecked()
中,它会正确地显示数组,但这没有任何意义,因为你无法控制何时执行该生命周期钩子或其他任何生命周期钩子。这是改用响应式表单的另一个原因 :P - AT82