【问题标题】:Best practice for Meteor AutoForm validation of items not in the form?Meteor AutoForm 验证不在表单中的项目的最佳实践?
【发布时间】:2016-12-02 06:20:14
【问题描述】:

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这样做。

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

【问题讨论】:

  • 这似乎类似于this posting。也许你可以采取类似的方法?
  • 不,有点不同。这个问题一般是关于 autoform - 当表单本身不包含正在验证的对象需要拥有的所有数据时,如何验证用户看到的表单。
  • 好吧,我希望对问题之间的相似之处有所不同。但是,直截了当地回答你,我不知道在 Autoform 中有什么方法可以简单地说“仅验证此表单的一部分,而忽略其余部分”。我能想到的唯一方法(在另一个问题的答案中涉及)是在模式中包含一些状态标志,您可以在自定义验证中使用它来打开/关闭给定字段的验证, 或将表单中的内容分解为单独的模式,以便它仅自行验证表单值。

标签: meteor meteor-autoform


【解决方案1】:

您必须使用quickFormautoFormschema 字段。然后,您创建模板助手以将架构传递给表单(或者,如果您的架构在全球范围内可用,您只需将 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;
  }
});
//  Profile.html

{{#autoForm id="profileEditForm" collection="Meteor.users" schema=profileSchema doc=currentUser type="update"}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多