使用Meteor单独进行表单验证

Sea*_*nWM 11 meteor meteor-collection2 simple-schema

我正在使用collection2,我试图让它来处理验证是一种特定的方式.我有一个看起来像这样的配置文件架构:

Schema.UserProfile = new SimpleSchema({
    name: {
        type: String,
        optional: false
    }
    location: {
        type: String,
        optional: true
    }
    gender: {
        type: String,
        optional: false
    }
});

Schema.User = new SimpleSchema({
    username: {
        type: String,
        optional: true
    },
    emails: {
        type: Array,
        optional: true
    },
    "emails.$": {
        type: Object
    },
    "emails.$.address": {
        type: String,
        regEx: SimpleSchema.RegEx.Email
    },
    "emails.$.verified": {
        type: Boolean
    },
    createdAt: {
        type: Date
    },
    profile: {
        type: Schema.UserProfile,
        optional: true
    },
    services: {
        type: Object,
        optional: true,
        blackbox: true
    },
    roles: {
        type: [String],
        optional: true
    },
    heartbeat: {
        type: Date,
        optional: true
    }
});

Meteor.users.attachSchema(Schema.User);
Run Code Online (Sandbox Code Playgroud)

现在,在我的注册表单上,我要求用户选择他们的性别,然后一旦他们登录,就会向用户提供一个单独的表格,询问他们的姓名和位置.这是问题所在:

注册表格有效,一切都经过保存.当他们尝试使用位置和名称保存内部表单时,虽然我收到错误:

Error invoking Method 'updateProfile': Gender is required [400]
Run Code Online (Sandbox Code Playgroud)

我知道它正在发生,因为它在架构中是必需的,但我已经获得了这些信息.我怎么不要求?或者我是否为每个表单设置验证?

Ste*_*ods 3

来自SimpleSchema 文档

假设您有一个必需的密钥“friends.address.city”,但“friends.address”是可选的。如果您正在验证的对象中设置了“friends.address”,但未设置“friends.address.city”,则会出现验证错误。但是,如果未设置“friends.address”,则“friends.address.city”不会出现验证错误,因为它所属的对象不存在。

因此,发生错误的原因是您在两个表单中都包含了个人资料,并且个人资料中的性别不是可选的。我可以想到两种方法来解决这个问题:

  1. 在配置文件下有其他对象,这些对象都是可选的,并且其中一个对象包含名称/位置的必填字段(尽管根据您的代码,在这两种情况下,位置似乎都是可选的),而另一个对象则包含性别的必填字段。我不是特别喜欢这个解决方案,但它不需要表单验证。

  2. 使用 jQuery 表单验证(我使用包 themeteorchef:jquery-validation)并将配置文件中的所有字段设为可选。

  3. 它看起来也像 SimpleSchema 接受该optional属性的函数,因此您可以在那里使用一些自定义逻辑 - 也许您在该函数中获得参数或上下文,这将允许您执行您想要的操作?

希望有帮助!