submit
非常有用,但是表单通常不包含模式中的所有数据,因此您会收到验证错误。
例如,我有一个ShoppingCartSchema = new SimpleSchema({
itemsOrdered: {
type: [Object],
optional: false,
},
totalPrice: {
type: Number,
optional: false,
},
customerAddress: {
type: Object,
optional: false
},
systemGeneratedInfo: {
type: Object,
optional: true,
blackbox: true
},
});
ShoppingCarts.attachSchema(ShoppingCartSchema);
按钮被禁用,直到它确定表单完全有效,但由于表单不包含模式中的所有数据,它永远不会显示它完全有效有效的。
说你有一个架构
{{> quickForm collection="ShoppingCarts" id="shoppingCartForm" type="insert"}}
我的表单代码如下:
totalPrice
显然,您不希望systemGeneratedInfo
成为表单上的项目,供用户自行填写。 totalPrice
可以是您的代码根据表单值生成的对象,但不会出现在表单本身上。
您可以将systemGeneratedInfo
放入隐藏的表单元素中,但这看起来很粗略。你真的不想用class ShadowedView: UIView {
override func awakeFromNib() {
layer.shadowColor = UIColor(red: 157.0/255.0, green: 157.0/255.0, blue: 157.0/255.0, alpha: 0.5).CGColor
layer.shadowOpacity = 0.8
layer.shadowRadius = 5.0
layer.shadowOffset = CGSizeMake(0.0, 2.0)
}
}
来做那件事。
还有哪些其他策略可用于处理未在表单上显示的对象上的项目,但是仍然允许前端显示的表单完全验证?
答案 0 :(得分:0)
您必须使用schema
或quickForm
的{{1}}字段。然后,您创建模板助手以将架构传递给表单(或者,如果您的架构在全球可用,则可以将autoForm
传递给表单)。
您可以只为次要形式的功能调整而完全定义 新模式,如果您有一个巨大的嵌套模式,而您只想省略几个字段,那么在我看来这是过大的尝试。或...
您只需将原始模式导入到Schemas.someSchema
中,然后在其上执行template.js
,并在将其传递给模板之前在助手(或其他地方)中本地修改字段和属性。
EJSON.clone
// Profile.js
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { AutoForm } from 'meteor/aldeed:autoform';
import { EJSON } from 'meteor/ejson';
import { Schema } from '../../../api/profiles/profiles.js';
Template.profile.helpers({
profileSchema: function() {
let userSchemaForAutoForm = EJSON.clone(Schema.User);
userSchemaForAutoForm._schema.emails.optional = true;
return userSchemaForAutoForm;
}
});