【发布时间】:2018-06-08 15:34:40
【问题描述】:
我正在使用一个 Angular 2+ 向导组件(我在 Angular 6 上),我将它分叉到我的项目中,并对其进行了很多模板和样式自定义。不幸的是,我选择的那个不支持其他向导中的 canExit 功能,所以我正在尝试添加它。它能够在步骤中验证表单,所以当我需要做的不仅仅是简单的字段验证时,我通常可以添加另一个自定义验证功能:
<custom-wizard>
<wizard-step [title]='Step 1' [isValid]='step1Form.valid && validateStep1()'>
<form>....
问题是这会被重复调用,因为我假设 Angular 的监视和更改检测。通常这不是问题,但我只想在他们点击 Next 时进行一次服务器端验证。重复调用它是行不通的。
所以我认为我需要将回调函数作为参数传递给子向导步骤组件:
<custom-wizard>
<wizard-step [title]='Step 1' [isValid]='step1Form.valid' [canExit]='validateStep1()'>
<form>....
在父组件中,我创建了我的验证函数:
validateStep1(){
console.log('calling server...');
// assume this is a server-side call, returning true/false
return serverValidationPassed();
}
在我添加的向导步骤组件中:
@Input() canExit: boolean = true;
在自定义向导中,我检查此回调是否失败,如果失败,则阻止正常的步骤更改:
public next(): void {
if(!this.activeStep.canExit){
console.log('failed!');
return;
}
else {
//proceed to next step as usual
}
}
问题是验证仍然被调用了很多次,我又回到了我开始的地方!我读到了使用 @Output 来传递函数的信息,所以我尝试了这种方法:
<custom-wizard>
<wizard-step [title]='Step 1' [isValid]='step1Form.valid' (canExit2)='validateStep1()'>
<form>....
在向导步骤中:
@Output() canExit2: EventEmitter<any> = new EventEmitter<any>();
在向导的下一个函数中:
public next(): void {
if(!this.activeStep.canExit2.emit()){
console.log('failed!');
return;
}
else {
//proceed to next step as usual
}
}
验证步骤现在只调用一次,很好。但即使 validateStep1 通过,我的 if 检查也会失败。我相信这是因为发射不返回任何东西,而是广播。这对我来说是新的领域。有人能指出我在这里做错了什么以及如何执行这个额外的验证吗?
【问题讨论】: