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)
我知道它正在发生,因为它在架构中是必需的,但我已经获得了这些信息.我怎么不要求?或者我是否为每个表单设置验证?
假设您有一个必需的密钥“friends.address.city”,但“friends.address”是可选的。如果您正在验证的对象中设置了“friends.address”,但未设置“friends.address.city”,则会出现验证错误。但是,如果未设置“friends.address”,则“friends.address.city”不会出现验证错误,因为它所属的对象不存在。
因此,发生错误的原因是您在两个表单中都包含了个人资料,并且个人资料中的性别不是可选的。我可以想到两种方法来解决这个问题:
在配置文件下有其他对象,这些对象都是可选的,并且其中一个对象包含名称/位置的必填字段(尽管根据您的代码,在这两种情况下,位置似乎都是可选的),而另一个对象则包含性别的必填字段。我不是特别喜欢这个解决方案,但它不需要表单验证。
使用 jQuery 表单验证(我使用包 themeteorchef:jquery-validation)并将配置文件中的所有字段设为可选。
它看起来也像 SimpleSchema 接受该optional
属性的函数,因此您可以在那里使用一些自定义逻辑 - 也许您在该函数中获得参数或上下文,这将允许您执行您想要的操作?
希望有帮助!
归档时间: |
|
查看次数: |
313 次 |
最近记录: |