如何使用相同的表单使用quickForm更新/插入记录?

时间:2014-08-19 00:07:10

标签: javascript meteor

我有这个Meteor模板:

<template name="personalDetailsForm">

 {{> quickForm collection="PersonalDetails" id="personalDetailsForm" type="insert"}}
 {{> quickForm collection="PersonalDetails" doc=editingDoc id="personalDetailsForm" type="update"}}

</template>

表格按我的预期显示,但我只想要一张表格。当提交表单时没有数据插入时的空白表单。然后,当重新加载表单时,先前提交的数据将显示在表单上。如果再次提交表单,则任何已更改的数据都将更新。

目前,插入表单正在显示,并在其下方显示更新表单,其中包含先前已插入的数据。尝试更新第二个表单上的数据不起作用,而是插入新记录。我想这可能是因为表单ID是相同的。

理想情况下,我想做这样的事情:

<body>
{{#if PersonalDetails}}
    {{> personalDetailsFormUpdate}}
{{ else }}
    {{> personalDetailsFormInsert}}
{{/if}}
</body>

<template name="personalDetailsFormInsert">
 {{> quickForm collection="PersonalDetails" id="personalDetailsFormInsert" type="insert"}}
</template>


<template name="personalDetailsFormUpdate">
 {{> quickForm collection="PersonalDetails" doc=editingDoc id="personalDetailsFormUpdate" type="update"}}
</template>

我认为文档的这一部分是我正在寻找的内容:

  

我可以为插入和更新重复使用相同的quickForm或autoForm吗?

     

是。在状态之间翻转的代码应按以下顺序执行以下操作:

Change the type attribute's value to "insert" or "update" as appropriate, probably by updating a reactive variable.
Change the doc attribute's value to the correct document for an update or to null (or a document containing default values) for an insert, probably by updating a reactive variable.
Call AutoForm.resetForm(formId). This will clear any existing validation errors for the form.

有人可以提供一个这方面的例子吗?

2 个答案:

答案 0 :(得分:3)

前一段时间问了这个问题,但我遇到了同样的问题并且解决了它。

这很容易:

像往常一样获取上下文数据。例如。用铁路由器,建立一条路线,如:

Router.route('Options', {
  path: 'options',
  data: function() {
    var options = Options.findOne({owner: Meteor.userId()});
    return options;
  }
});

构建一个新的帮助程序,检查上下文数据(在帮助程序中)是否为空(例如,对于在每个模板中都有效的全局帮助程序):

UI.registerHelper("formType", function(){

  if(_.isEmpty(this)) {
    return 'insert'
  } else {
    return 'update';
  }

});

使用新助手设置模板:

<template name="Options">
<h1>Options</h1>
{{> quickForm collection="Options" doc=this id="optionsForm" type=formType omitFields="owner"}}
</template>

现在一切都应该有效。如果数据库没有返回值,表单将自动切换到插入。所以在我的例子中,如果你第一次打开表单,它将使用insert。第二次,它将使用更新。

答案 1 :(得分:0)

谢谢@peXd。这非常有帮助。但我在我的架构中有一个额外的必填字段,它阻止插入,它无声地插入,因为我通过8个陷阱门偶然发现了这个解决方案,我想我会发布它,以防它帮助其他人。

我从aldeed [https://github.com/aldeed/meteor-autoform/issues/199]中找到了这个建议,在客户端代码中使用此错误挂钩:

AutoForm.addHooks(null, {
  onError: function (name, error, template) {
     console.log(name + " error:", error);
  }
});

然而,这也失败了,我说没有定义AutoForm。这对我来说很奇怪,因为aldeed:autoform被作为依赖项被拉入项目。但只是要仔细检查我做了流星添加aldeed:autoform直接拉入它,突然AutoForm可用于添加钩子。