使用autoform和collection2

时间:2016-08-04 08:04:29

标签: meteor meteor-autoform meteor-collection2 simple-schema

我有两种形式,两种模式没有任何共同之处。但我仍然需要将它们存储在同一个集合中。

例如:

schema1 = new SimpleSchema({ field1, field2, field3 });
collection.attachSchema(schema1);

schema2 = new SimpleSchema({ fieldX, fieldY, fieldZ });
collection.attachSchema(schema2);

Collection2 documentation可以理解,上述方法实际上将两个模式合并为一个大模式。这意味着两个表单都必须包含属于这两个模式的所有字段。

这意味着我不能只使用schema1的autoForm和只使用schema2的另一个autoform。

根据文档,我尝试实现replace:true - 通过它,每次都会覆盖架构。 (至少这是我理解它的方式 - 它们不会合并到一个大的模式中)

例如:

schema1 = new SimpleSchema({ field1, field2, field3 });
collection.attachSchema(schema1, {replace: true});

schema2 = new SimpleSchema({ fieldX, fieldY, fieldZ });
collection.attachSchema(schema2 {replace: true});

上面仍然没有解决问题,不知何故,模式仍然合并。这意味着,即使没有填写fieldX的规定,我仍然会收到有关autox1中FieldX为空的通知。

我还尝试了另一种使用变体的方法。

例如:

schema1 = new SimpleSchema({ field1, field2, field3 });
collection.attachSchema(schema1, {selector: {type: 'forForm1'}});

schema2 = new SimpleSchema({ fieldX, fieldY, fieldZ });
collection.attachSchema(schema2, {selector: {type: 'forForm2'}});

当我实现上述内容时,我得到一个autoform错误,指出在处理多个模式时必须传递doc的参数。

我该怎么做?

文件明确指出:

  

现在两个模式都已附加。当您插入文档类型时:   在文档中“简单”,它将仅针对   SimpleProductSchema。当您插入文档类型:'variant'时   在文档中,它将仅针对   VariantProductSchema。

我不知道如何通过doc = ????在模板中。有人可以指导我吗?

这是我的autoform模板:

Form1中:

{{#autoForm    collection = "pgTemplates"  type ="insert" doc= ???? id ="InsertForm1" }}
{{#each afFieldNames}}
{{> afQuickField name=this.name options = afOptionsFromSchema  }}
{{/each}}

窗体2:

{{#autoForm    collection = "pgTemplates"  type ="insert" doc= ???? id ="InsertForm1" }}
{{#each afFieldNames}}
{{> afQuickField name=this.name options = afOptionsFromSchema  }}
{{/each}}

1 个答案:

答案 0 :(得分:0)

根据autoform的documentation

  

doc:更新表单必填,且必须至少有_id   属性。传递当前文档对象,通过调用检索   例如findOne()。对于插入表单,您也可以使用它   用于传递具有默认表单值集的对象的属性(相同   效果为在表单中的每个字段上设置值属性。)

在这种情况下还可以使用另一个参数schema

  

schema:如果未设置集合,则为必需。将使用此架构   在提交之前生成并验证表单,以便您指定   这个以及一个集合,如果你想使用一个模式   与您的收藏品使用的略有不同。然而   最终对象仍然必须通过对集合的验证   架构。设置为以下之一:

     
      
  • 返回SimpleSchema实例的辅助函数(无引号)的名称。
  •   
  • 窗口命名空间中的SimpleSchema实例的名称(在引号中)。
  •   

因此,您可以尝试根据每种情况下的特定schema设置架构参数,并尝试在doc中传递当前文档对象。

我认为模板看起来像:

<强> Form1中:

{{#autoForm  collection = "pgTemplates"  schema="schema1"  type ="insert" doc=docObject id ="InsertForm1" }}
  {{#each afFieldNames}}
    {{> afQuickField name=this.name options = afOptionsFromSchema1  }}
  {{/each}}

<强>窗体2:

{{#autoForm  collection = "pgTemplates"  schema="schema2"  type ="insert" doc=docObject id ="InsertForm1" }}
  {{#each afFieldNames}}
    {{> afQuickField name=this.name options = afOptionsFromSchema2  }}
  {{/each}}

在上述情况下,您需要确保在窗口命名空间中正确使用schema个实例

或者您可以使用辅助函数返回特定实例,例如:

有助手:

{{#autoForm  collection = "pgTemplates"  schema=getSchema1  type ="insert" doc=docObject id ="InsertForm1" }}
    {{#each afFieldNames}}
      {{> afQuickField name=this.name options = afOptionsFromSchema2  }}
    {{/each}}