Aurelia - ValidationController 总是 returns true
Aurelia - ValidationController always returns true
我用 aurelia 制作了一个向导,我想在用户点击 next
按钮时检查输入值。
@autoinject()
export class settingsWizard {
steps: Step[];
activeStep: Step;
valController: ValidationController;
constructor(private i18n: I18N, private http: HttpClient, public wizard: Wizard, private log: Logger, private router: Router, private controllerFactory: ValidationControllerFactory) {
this.steps = [
new Step(1, this.i18n.tr("route1"), PLATFORM.moduleName('./steps/step1')),
new Step(2, this.i18n.tr("route2"), PLATFORM.moduleName('./steps/step2')),
new Step(3, this.i18n.tr("route3"), PLATFORM.moduleName('./steps/step3')),
new Step(4, this.i18n.tr("route4"), PLATFORM.moduleName('./steps/step4')),
];
ValidationRules
.ensure('availableTotalTime').required().on(this.wizard.plannedTime);
//.ensureObject()
//.satisfies((x: IQualityRate) => x.numberOfProducedQuantity > x.rejects)
//.withMessage(this.i18n.tr('quality-rate.rejectsHigherThanProducedQuantity'))
//.on(wizard.qualityRate);
this.valController = controllerFactory.createForCurrentScope();
this.valController.validateTrigger = validateTrigger.manual;
}
这是下一个按钮事件:
nextStep() {
this.valController.validate().then(result => {
if (result.valid) {
if (this.activeStep.id !== this.steps.length) {
this.activeStep = this.steps[this.activeStep.id];
}
}
});
}
我的 aurelia ValidationController 总是 returns result.valid = true
即使 availableTotalTime
是 undefined
。我做错了什么?
您可能假设 ValidationRules
api 会自动使对象得到验证,但它只将规则存储在对象的原型上。
ValidationController
仅验证显式 (1) 或隐式 (2) 注册的对象,或直接提供 (3) 给它的对象。
1。注册"implicitly"
视图中具有 & validate
绑定行为的任何 属性 将在您在同一视图模型中调用 controller.validate()
时进行验证。
2。明确注册
同样,controller.addObject(this.wizard.plannedTime)
将导致在后续调用 .validate()
时验证该对象(及其所有属性)
3。提供 ValidateInstruction
this.valController.validate({
object: this.wizard.plannedTime,
// optional: propertyName: ...,
// optional: rules: ...
});
这为您提供了最高程度的控制。它将仅 验证您传入的对象,而不是其他任何东西。此外,它不会注册该对象,因此对 .validate()
的后续调用不会再次自动验证它。
您可能想要选择选项 2 或 3,具体取决于其他问题。
我遇到了同样的问题,所以到了这里。 Fred Kleuver 的回答是正确的,但只有在创建规则时使用 .on
注册您的视图模型(或者在本例中,要验证具有 属性 的对象)时才正确。
如果您像我一样明确地将验证规则传递给绑定行为,例如 & validate:myRules
(这恰好是我在网上看到的大多数示例的做法)您将需要遵循 documentation.That 方式的 Entity Validation 部分,您可以将验证规则显式传递到 validationController.addObject
调用中,就像将规则传递给视图中的绑定行为一样.
this.validationRules = ValidationRules
.ensure('availableTotalTime')
.required()
.rules;
this.validationController.addObject(this.wizard.plannedTime, this.validationRules);
我用 aurelia 制作了一个向导,我想在用户点击 next
按钮时检查输入值。
@autoinject()
export class settingsWizard {
steps: Step[];
activeStep: Step;
valController: ValidationController;
constructor(private i18n: I18N, private http: HttpClient, public wizard: Wizard, private log: Logger, private router: Router, private controllerFactory: ValidationControllerFactory) {
this.steps = [
new Step(1, this.i18n.tr("route1"), PLATFORM.moduleName('./steps/step1')),
new Step(2, this.i18n.tr("route2"), PLATFORM.moduleName('./steps/step2')),
new Step(3, this.i18n.tr("route3"), PLATFORM.moduleName('./steps/step3')),
new Step(4, this.i18n.tr("route4"), PLATFORM.moduleName('./steps/step4')),
];
ValidationRules
.ensure('availableTotalTime').required().on(this.wizard.plannedTime);
//.ensureObject()
//.satisfies((x: IQualityRate) => x.numberOfProducedQuantity > x.rejects)
//.withMessage(this.i18n.tr('quality-rate.rejectsHigherThanProducedQuantity'))
//.on(wizard.qualityRate);
this.valController = controllerFactory.createForCurrentScope();
this.valController.validateTrigger = validateTrigger.manual;
}
这是下一个按钮事件:
nextStep() {
this.valController.validate().then(result => {
if (result.valid) {
if (this.activeStep.id !== this.steps.length) {
this.activeStep = this.steps[this.activeStep.id];
}
}
});
}
我的 aurelia ValidationController 总是 returns result.valid = true
即使 availableTotalTime
是 undefined
。我做错了什么?
您可能假设 ValidationRules
api 会自动使对象得到验证,但它只将规则存储在对象的原型上。
ValidationController
仅验证显式 (1) 或隐式 (2) 注册的对象,或直接提供 (3) 给它的对象。
1。注册"implicitly"
视图中具有 & validate
绑定行为的任何 属性 将在您在同一视图模型中调用 controller.validate()
时进行验证。
2。明确注册
同样,controller.addObject(this.wizard.plannedTime)
将导致在后续调用 .validate()
3。提供 ValidateInstruction
this.valController.validate({
object: this.wizard.plannedTime,
// optional: propertyName: ...,
// optional: rules: ...
});
这为您提供了最高程度的控制。它将仅 验证您传入的对象,而不是其他任何东西。此外,它不会注册该对象,因此对 .validate()
的后续调用不会再次自动验证它。
您可能想要选择选项 2 或 3,具体取决于其他问题。
我遇到了同样的问题,所以到了这里。 Fred Kleuver 的回答是正确的,但只有在创建规则时使用 .on
注册您的视图模型(或者在本例中,要验证具有 属性 的对象)时才正确。
如果您像我一样明确地将验证规则传递给绑定行为,例如 & validate:myRules
(这恰好是我在网上看到的大多数示例的做法)您将需要遵循 documentation.That 方式的 Entity Validation 部分,您可以将验证规则显式传递到 validationController.addObject
调用中,就像将规则传递给视图中的绑定行为一样.
this.validationRules = ValidationRules
.ensure('availableTotalTime')
.required()
.rules;
this.validationController.addObject(this.wizard.plannedTime, this.validationRules);