【问题标题】:Separate form validation with Meteor使用 Meteor 进行单独的表单验证
【发布时间】:2016-04-30 20:31:21
【问题描述】:

我正在使用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]

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

【问题讨论】:

  • 您在寻找什么样的额外细节?
  • 我只是在寻找更多反馈和更优雅的解决方案。

标签: meteor meteor-collection2 simple-schema


【解决方案1】:

您必须通过 jquery 添加验证,或者您可以使用 toaster 在客户端显示错误。 另请阅读:link

【讨论】:

    【解决方案2】:

    我假设您在表单中使用aldeed:autoform。当您在表格中使用normal type 时,必须提交所有字段,即使是那些已填写且标记为必填的字段。解决此问题的两种方法:

    • 肮脏的方式:使用预填充的值设置隐藏字段。
    • 您也可以将表单类型设置为updateas seen in the doc。这样,simple-schema 将验证您的 newDoc 已经填写了您之前的条目,而不会尖叫。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        来自SimpleSchema docs

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

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

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

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

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

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 2013-02-24
          • 1970-01-01
          • 2013-03-20
          • 2018-05-11
          • 2015-06-25
          • 2017-02-04
          • 2015-07-31
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多