【发布时间】:2017-08-16 17:10:10
【问题描述】:
目标是当用户单击按钮转到下一页时,阻止用户继续并在页面部分填写但无效时显示错误指示符。
在模板驱动的表单中,我有几个容器元素使用NgModelGroup 属性来表示表单中的“页面”。在我的组件中,我想引用这个集合,以便可以使用索引访问它们。由于我无法获得这个集合(@AJT_82 cmets 为什么在下面),这是我的方法:
我创建了一个类来保存有关页面的信息。
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' + currentPg+1 的个人ngModelGroup(+1 以匹配视图,因为数组从 0 开始),然后我可以在单击事件中使用它,这将导致 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 属性。在选项卡元素上分配“有错误”类以设置选项卡的样式。
<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是什么? -
您没有附加对您正在使用的表单的引用查看子
-
但你可以看到我想要达到的目标:不,我不能。说明您想要实现的目标。
-
首先,您的 ViewChild 引用是错误的。您在 html 中将其定义为 #form,但在 ts 文件中使用 'f'。
-
没有表单控件,但试图使表单组的数组给出空数组。但是,如果我把它放在
ngAfterViewChecked()中,它会正确显示数组,但是把它放在那里或任何其他你无法控制何时执行的生命周期钩子是没有意义的。为什么要更改为反应形式的另一个原因:P
标签: angular