1

我有一个看起来像这样的用户配置文件架构:

Schema.UserProfile = new SimpleSchema({
    name: {
        type: String,
        optional: false
    },
    gender: {
        type: String,
        optional: false,
        allowedValues: ['Male', 'Female']
    },
    location: {
        type: String,
        optional: false
    },
    age: {
        type: Number,
        optional: false
    }
}

我的注册表要求用户在上面选择他们的性别。注册后,用户会看到另一个表单来填写其余数据:姓名、位置和年龄。

问题是:当用户尝试注册时,我收到错误:Name is required. 用户在注册之前不应该输入他们的名字。

仅验证实际保存在特定表单上的数据的正确方法是什么?

编辑

这是我的注册脚本:

var data = {};
var profile = {};
data.email = $('#email').val();
data.password = $('#password').val();
profile.gender = $('#gender').val();
data.profile = profile;

Accounts.createUser(data, function (error) {
   // do
   // ERROR: Name is required
});

当用户实际注册时,他们会看到一个表单来填写其他数据。表单提交会调用一个方法,该方法会尝试更新配置文件对象。

4

2 回答 2

0

您可以使用 SimpleSchema 的pick命令从模式中选择某些元素。这样,您可以拥有从相同的原始模式定义派生的多个模式。

Schemas.UserProfileRegistration1 = Schemas.UserProfile.pick(['gender']);

Schemas.UserProfileRegistration2 = Schemas.UserProfile.pick(['name', 'location', 'age']);

https://github.com/aldeed/meteor-simple-schema#extracting-simpleschemas

于 2016-05-25T20:51:35.180 回答
0

通过使用该选项optional: false,您可以在创建对象时强制执行该选项。

一种解决方案是使用myCollection.insert();标志validate: false而不是createUser().

例如

myCollection.insert(doc, {validate: false});

这不会触发错误,因为正在跳过验证。

我个人不会使用这种方式,但它可能是一个解决方案。

于 2016-02-22T19:58:51.253 回答