Meteor AutoForm验证不在表单中的项目的最佳实践?

时间:2016-07-28 03:15:42

标签: meteor meteor-autoform

当您想要使用模式验证表单时,

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) } } 来做那件事。

还有哪些其他策略可用于处理未在表单上显示的对象上的项目,但是仍然允许前端显示的表单完全验证?

1 个答案:

答案 0 :(得分:0)

您必须使用schemaquickForm的{​​{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;
  }
});