2

我正在开发一个 Meteor 应用程序,用户在其中遵循多步注册过程。他们首先注册,然后在访问仪表板之前通过3 个自定义表单。我在 update-mode 和Collection2上使用Autoform来验证不同的表单。注册后,用户更新每个表单上的必要值,字段/输入错误由 Collection2 处理。

我的问题是:虽然我开始项目时将所有字段和子字段都设置为可选,但我想让它们成为强制性的,因此 Collection2 也可以处理缺失的输入。但是当我删除可选选项时,我的表单仍然正确更新,现在可以处理空字段,但用户无法再注册。

Exception while invoking method 'createUser' Error: First name is required

我目前正在调用 Meteor.createUser 客户端,我想知道是否有任何方法可以阻止 Meteor.createUser 检查插入时的所有非可选字段。我知道我可以称它为服务器端,但我必须在提交时加密密码,我什至不确定我是否可以从那里绕过 C2 验证。

用户首先注册然后可以继续或离开并回来完成填写表格非常重要。我知道我可以在最后一个表单上使用 createUser 或将所有可选内容放回原处并在每个字段上进行一些自定义验证,但我正在寻找一些“更漂亮”的方式。任何投入将不胜感激!

4

1 回答 1

0

经过多次测试,我终于找到了解决方法。将您的必填字段设置在可选的嵌套模式中,以便验证不会在插入时失败。

另外,请确保您没有从一开始就在可选嵌套模式中创建自动值或值,否则它会创建它然后触发验证(两者都是我的情况,我在表单进度跟踪器上有一个自动值在每个新步骤上设置和更新)。


这是一个具体的例子:

Posts = new Mongo.Collection("posts");

var Schema = {};
Schema.Replies = new SimpleSchema({
    owner: {
        type: String
    },
    content: {
        type: String
    }
});

Schema.Posts = new SimpleSchema({
    createdAt: {
        type: Date,
        autoValue: function() {
            if (this.isInsert)
                return new Date();
            else if (this.isUpsert)
                return {$setOnInsert: new Date()};
            else
                this.unset();
        },
        optional: true
    },
    content: {
        type: String
    },
    replies: {
        type: [Schema.Replies],
        optional: true
    },
    owner: {
        type: String,
        autoValue: function() {
            if (!this.isSet) {
                return this.userId;
            }
        }
    },
});

Posts.attachSchema(Schema.Posts);

所以你可以有一个Postwhich 可以包含回复,也可以包含回复。但是,如果您决定添加回复,则必须填写嵌套架构中的所有必填字段,否则您的更新将被拒绝。您可以将此逻辑复制到任何东西(因此在我的情况下,Meteor.user随着我们的注册表单继续更新)。希望能帮助到你。

于 2015-07-30T09:54:40.687 回答