如何反应使用node-simple-schema?

时间:2016-08-31 20:52:09

标签: mongodb meteor reactjs simple-schema meteor-tracker

鉴于没有太多关于此的例子,我尽可能地遵循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()应该为假时,组件永远不会重新呈现。

我错过了什么?

1 个答案:

答案 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