Meteor Autoform - 防止更新字段

时间:2015-07-08 16:29:49

标签: meteor meteor-autoform

在我的autoform中,字段的值是两个其他输入字段的差异。用户不允许更新。不幸的是,目前无法在表单中将单个字段设置为只读。所以我的方法是创建一个autoValue和一个自定义验证来阻止更新

到目前为止我的代码:

        'SiteA.Settings.RXSignalODU1difference': {
            type: Number,
            label: "RX Signal [dBm] ODU1 difference (without ATPC +/- 3dbm)",
            decimal: true,
            autoform: {
              type: "number"
            },
            autoValue: function() {
                var ODU1gemessen = this.field("SiteA.Settings.RXSignalODU1");
                var ODU1planned = this.field("SiteA.Settings.RXSignalODU1planned");
                if (ODU1gemessen.isSet || ODU1planned.isSet) {
                    return ODU1gemessen.value - ODU1planned.value;
                }
            },
            custom: function() {
                var ODU1gemessen = this.field("SiteA.Settings.RXSignalODU1");
                var ODU1planned = this.field("SiteA.Settings.RXSignalODU1planned");
                var dif = ODU1gemessen.value - ODU1planned.value;
                if (this.value !== dif) {
                    return "noUpdateAllowed";
                }
            }
        },

My Simple.Schema消息:

SimpleSchema.messages({noUpdateAllowed: "Can't be updated"});

不幸的是,没有任何消息弹出。

1 个答案:

答案 0 :(得分:1)

修改

此方法将在表单中创建一个禁用的输入框,该输入框将在用户键入时自动显示两个其他输入字段之间的差异。

首先,我们为计算中使用的值定义会话变量,并将它们初始化为undefined。

Template.xyz.onRendered({
  Session.set("ODU1gemessen", undefined);
  Session.set("ODU1planned", undefined);
});

然后我们定义两个事件,它们会在用户输入时自动更新这些会话变量。

Template.xyz.events({
  'keyup #RXSignalODU1' : function (event) {
    var value = $(event.target).val();
    Session.set("ODU1gemessen", value);
  },
  'keyup #RXSignalODU1planned' : function (event) {
    var value = $(event.target).val();
    Session.set("ODU1planned", value);
  }

});

然后我们定义一个帮助来计算差异。

Template.xyz.helpers({
  RXSignalODU1difference : function () {
    var ODU1gemessen = Session.get("ODU1gemessen");
    var ODU1planned = Session.get("ODU1planned"); 

    if (!!ODU1gemessen || !!ODU1planned) {
      return ODU1gemessen - ODU1planned;
    }
  }
});

我的HTML标记看起来像这样。请注意,为了仍然控制表单的顺序,我使用{{#autoform}}和一系列{{> afQuickfields}}而不是{{> quickForm}}

要显示计算的差异,我只需创建一个带有禁用文本框的自定义div。

<template name="xyz">
  {{#autoForm collection="yourCollection" id="yourId" type="insert"}}
    <fieldset>
      <legend>Enter legend text</legend>
      {{> afQuickField name="SiteA.Settings.RXSignalODU1" id="RXSignalODU1"}}
      {{> afQuickField name="SiteA.Settings.RXSignalODU1planned" id="RXSignalODU1planned"}}
      <div class="form-group">
          <label class="control-label">RXSignalODU1difference</label>
          <input class="form-control" type="text" name="RXSignalODU1difference" disabled value="{{RXSignalODU1difference}}">
          <span class="help-block"></span>
        </div>
    </fieldset>
    <button class="btn btn-primary" type="submit">Insert</button>
  {{/autoForm}}
</template>

原始答案 - 不推荐

如果您要将表单生成为quickForm,则可以执行类似

的操作
{{>quickForm collection='yourCollection' omitFields='SiteA.Settings.RXSignalODU1difference'}}

这会将此字段保留在表单之外,因此用户无法对其进行更新。

如果您仍希望在用户键入其他两个值时在表格中显示值,则可以在客户端js中定义帮助程序

类似

Template.yourFormPage.helpers({
    diff: function () {
        var ODU1gemessen = $('[name=SiteA.Settings.RXSignalODU1]').val();
        var ODU1planned = $('[name=SiteA.Settings.RXSignalODU1planned]').val();
        if (!!ODU1gemessen || !!ODU1planned) {
            return ODU1gemessen - ODU1planned;
        }
     }
});

您想要仔细检查字段名称在DOM中的呈现方式。 Autoform使用模式中的字段名称分配name属性,但我不知道它如何处理嵌套键...(即它是否命名元素&#39; SiteA.Settings.RXSignalODU1&#39;或者只是&#39; RXSignalODU1&#39;)

然后只需在html中的某处显示值:

{{diff}}