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 即使 availableTotalTimeundefined。我做错了什么?

您可能假设 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);