Aurelia Validation:条件变更时如何重新验证规则?
解决Aurelia Validation条件变更后重新验证的问题
这个问题挺常见的——Aurelia Validation默认不会自动监听when条件里依赖的属性变化,所以当isInitialized从false改成true后,之前的验证状态不会自动更新。下面给你几种可行的解决方案:
1. 手动触发验证(最直接)
当你设置entity.isInitialized = true的时候,直接调用ValidationController的validate方法,强制重新验证实体(或者只验证name属性,更高效)。
示例代码:
import { inject, NewInstance } from 'aurelia-framework'; import { ValidationController, ValidationRules } from 'aurelia-validation'; @inject(NewInstance.of(ValidationController)) export class YourComponent { entity = { isInitialized: false, name: '' }; constructor(private validationController: ValidationController) { // 定义验证规则 ValidationRules .ensure((e: any) => e.name) .required() .when((e: any) => e.isInitialized) .on(this.entity); } // 假设这是触发初始化完成的方法 completeInitialization() { this.entity.isInitialized = true; // 手动触发整个实体的验证 this.validationController.validate({ object: this.entity }); // 或者只验证name属性,减少不必要的验证操作 // this.validationController.validate({ object: this.entity, propertyName: 'name' }); } }
2. 订阅属性变化自动触发验证
如果不想每次修改isInitialized都手动写验证逻辑,可以通过Aurelia的绑定引擎监听isInitialized的变化,自动触发验证:
import { inject, NewInstance } from 'aurelia-framework'; import { ValidationController, ValidationRules } from 'aurelia-validation'; import { BindingEngine } from 'aurelia-framework'; @inject(NewInstance.of(ValidationController), BindingEngine) export class YourComponent { entity = { isInitialized: false, name: '' }; private propertySubscription: any; constructor( private validationController: ValidationController, private bindingEngine: BindingEngine ) { // 定义验证规则 ValidationRules .ensure((e: any) => e.name) .required() .when((e: any) => e.isInitialized) .on(this.entity); // 监听isInitialized属性的变化 this.propertySubscription = this.bindingEngine .propertyObserver(this.entity, 'isInitialized') .subscribe(() => { this.validationController.validate({ object: this.entity }); }); } // 组件销毁时取消订阅,避免内存泄漏 detached() { if (this.propertySubscription) { this.propertySubscription.dispose(); } } }
核心原因说明
当when条件依赖的属性(比如这里的isInitialized)发生变化时,Aurelia Validation不会自动重新评估规则并触发验证——它只会在被验证属性(name)本身变化时自动校验。所以必须手动触发一次验证操作,才能更新错误状态。
内容的提问来源于stack exchange,提问作者Gabriel Mančík
相关产品推荐
相关产品推荐

