鉴于没有太多关于此的例子,我尽可能地遵循docs,但验证不是被动的。
我声明了一个架构:
import { Tracker } from 'meteor/tracker';
import SimpleSchema from 'simpl-schema';
export const modelSchema = new SimpleSchema({
foo: {
type: String,
custom() {
setTimeout(() => {
this.addValidationErrors([{ name: 'foo', type: 'notUnique' }]);
}, 100); // simulate async
return false;
}
}
}, {
tracker: Tracker
});
然后我在我的组件中使用此模式:
export default class InventoryItemForm extends TrackerReact(Component) {
constructor(props) {
super(props);
this.validation = modelSchema.newContext();
this.state = {
isValid: this.validation.isValid()
};
}
...
render() {
...
const errors = this.validation._validationErrors;
return (
...
)
}
}
因此,每当我尝试验证foo
时,异步'调用自定义函数,并调用正确的addValidationErrors
函数,但是当this.validation.isValid()
应该为假时,组件永远不会重新呈现。
我错过了什么?
答案 0 :(得分:2)
您的代码实际上有两个错误。首先,this.addValidationErrors
不能在自定义验证中异步使用,因为它没有引用正确的验证上下文。其次,TrackerReact
仅在.isValid
函数内注册反应数据源(例如render
),因此仅访问其中的_validationErrors
是不够的。因此,要使其工作,您需要使用命名的验证上下文,并在render函数(或其调用的其他函数)中调用isValid
,如下所示:
custom() {
setTimeout(() => {
modelSchema.namedContext().addValidationErrors([
{ name: 'foo', type: 'notUnique' }
]);
}, 100);
}
组件
export default class InventoryItemForm extends TrackerReact(Component) {
constructor(props) {
super(props);
this.validation = modelSchema.namedContext();
}
render() {
let errors = [];
if (!this.validation.isValid()) {
errors = this.validation._validationErrors;
}
return (
...
)
}
}
详细了解异步验证here。