Meteor autoform - 计算隐藏字段的值

Meteor autoform - compute value for hidden field

在 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' 的值是 "one change behind" 'optionID' 的值,这意味着函数计算 'score' 是正确的,但保存到 mongo 似乎发生在 'score' 值更新之前,因此在 mongo 中,'score' 具有 [=13] 之前的值=] 最后更改。

比如我让'score'不隐藏,这样我就可以修改了,直接在网页中修改,它的值就会在mongo中正确反映出来。但是在网页中修改 'optionID' 会产生 "one change behind" 行为。

有没有办法让 meteor autoform 字段依赖于同一表单中的另一个字段,而不需要它 "lag behind" 总是一次更改自动保存?

与其使用模板助手来计算隐藏 score 字段的值,不如考虑使用 autoform hook。因此,不是使用 selectedOptionScore 模板助手,而是定义一个钩子,如:

AutoForm.addHooks(['your-form-id'], {
  before: {
    method-update(doc) {
      doc.score = someFunction(doc.optionID);
      return doc;
    }
  }
});

通过这种方式,在您的表格被保存之前,计算出的分数已设置,并与其他所有内容一起保存。