Aurelia - ValidationController всегда возвращает true - PullRequest
0 голосов
/ 04 мая 2018

Я создал мастер с 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;
}

вот событие nextButton:

   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 всегда возвращает result.valid = true, хотя availableTotalTime равно undefined. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Закончилось здесь, когда у меня возникла та же проблема. Ответ Фреда Клёвера верен, но только при использовании .on для регистрации модели представления (или в этом случае объекта со свойством, подлежащим проверке) при создании ваших правил.

Если вы похожи на меня, и вы явно передаете правила валидации в поведение привязки, например & validate:myRules (именно так и поступает большинство примеров, которые я видел в Интернете), вам нужно будет следовать часть документации Проверка сущности . Таким образом, вы можете явно передать свои правила проверки в ваш вызов validationController.addObject так же, как вы передали бы свои правила поведению связывания в своем представлении.

this.validationRules = ValidationRules
    .ensure('availableTotalTime')
    .required()
    .rules;

this.validationController.addObject(this.wizard.plannedTime, this.validationRules);
0 голосов
/ 05 мая 2018

Возможно, вы предполагаете, что API ValidationRules автоматически вызывает проверку объектов, но сохраняет только правила в прототипе объекта.

ValidationController проверяет только объекты, которые явно (1) или неявно (2) зарегистрированы или непосредственно предоставлены (3) ему.

1. Регистрация "неявно"

Любое свойство в представлении, которое имеет поведение привязки & 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, в зависимости от других проблем.

...