Meteor autoform - 计算隐藏字段的值

时间:2016-08-08 20:58:53

标签: javascript meteor meteor-autoform

在meteor autoform中(使用经典的aldeed包:https://github.com/aldeed/meteor-autoform),我有一个名为'score'的隐藏字段,其值是另一个名为'optionID'的字段的函数。

{{#autoForm
  class                = "autoform"
  id                   = dataID
  collection           = (getCollection 'DataColl')
  doc                  = dataDoc
  type                 = "method-update"
  meteormethod         = "DataColl.autoformUpsert"
  singleMethodArgument = true
  autosave             = true
}}

  {{> afQuickField
    name         = 'optionID'
    type         = "select-radio"
    template     = "buttonGroup"
    options      = scoreOptions
  }}

  {{> afQuickField
    name         = 'score'
    type         = "hidden"
    value        = selectedOptionScore
  }}

{{/autoform}}

函数selectedOptionScore取决于' optionID'的选定值。 (使用Autoform.getFieldValue

Template.formTemplate.helpers({
  selectedOptionScore(): String {
    const optionID = AutoForm.getFieldValue('optionID');
    const optionScore = someFunction(optionID);
    return optionScore;
  },
});

问题在于,在表单的每次自动保存中,'score'的值为"后面有一个更改" 'optionID'的值,意味着函数computing 'score'是正确的,但是在更新'score'值之前似乎已经发生了对mongo的保存,因此在mongo中,'score'具有在'optionID'上次更改之前的正确价值。

例如,如果我没有隐藏'score'以便我可以修改它,直接在网页中修改它将使其值在mongo中正确反映。但是,修改网页中的'optionID'会导致"背后的一个变化"行为。

有没有办法让meteor autoform字段依赖于同一形式的另一个字段,而不会让它"落后"通过一次改变自动保存?

1 个答案:

答案 0 :(得分:1)

您可能希望使用autoform hook,而不是使用模板助手来计算隐藏的score字段的值。因此,您可以定义一个类似于:

的钩子,而不是使用selectedOptionScore模板帮助器
AutoForm.addHooks(['your-form-id'], {
  before: {
    method-update(doc) {
      doc.score = someFunction(doc.optionID);
      return doc;
    }
  }
});

这样就可以在保存表单之前设置计算得分,并保存其他所有内容。