问题 使用Meteor单独进行表单验证


我在用着 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);

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

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

Error invoking Method 'updateProfile': Gender is required [400]

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


8955
2018-01-24 14:56


起源

你在寻找什么样的额外细节? - Stephen Woods
我只是在寻找更多的反馈和更优雅的解决方案。 - SeanWM


答案:


您必须通过jquery添加验证,或者您可以使用烤面包机在客户端显示错误。 另请阅读: 链接


3
2018-01-27 09:59





我假设你使用 aldeed:autoform 为您的表格。当你使用 normal type 在表格中,所有字段,甚至那些已标记为强制性字段的字段都必须提交。解决这个问题的两种方法:

  • 脏方法:使用预填充值设置隐藏字段。
  • 您还可以将表单类型设置为 update  正如在文档中看到的那样。这条路, simple-schema 将验证你的 newDoc 已经充满你以前的条目而没有尖叫。

第二个解决方案是我在大多数情况下使用的解决方案。这个加号 autoform's hooks 为您提供足够的灵活性,以适应您可能遇到的大多数用例。


3
2018-02-01 18:02





我不知道它是否是一个更优雅的解决方案,但我们已经停止将simpleSchemas附加到当前项目中的文档。

我们在每个集合的命名空间中都有不同的模式,一个用于检查插入时的用户输入,一个用于更新,另一个用于在插入新文档时填充defaultValue(可以由客户端或服务器完成,在在哪种情况下我们不检查输入)。我们调用.validate()或.clean()取决于我们想要做什么。

通过巧妙地使用从模式数组构建模式的可能性,我们最终不会编写更大的模式(尽管它们还有更多模式),但我们可以完全控制何时检查以及检查哪些字段。


3
2018-02-10 08:41





来自 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 属性,所以你可以在那里使用一些自定义逻辑 - 也许你在该函数中获得参数或上下文,这将允许你做你想要的?

希望有所帮助!


3
2018-01-26 01:41