在我的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"});
不幸的是,没有任何消息弹出。
答案 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}}