Meteor Autoform - 防止字段更新
Meteor Autoform - Prevent Field from Update
在我的自动表单中,一个字段的值是另外两个输入字段的差值。不允许用户更新。不幸的是,目前无法在表单中将单个字段设置为只读。所以我的方法是创建一个 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";
}
}
},
我的Simple.Schema留言:
SimpleSchema.messages({noUpdateAllowed: "Can't be updated"});
很遗憾,没有弹出消息。
编辑
此方法将在您的表单中创建一个禁用的输入框,该输入框将在用户键入时自动显示其他两个输入字段之间的差异。
首先,我们为计算中使用的值定义会话变量,并将它们初始化为未定义。
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);
}
});
然后我们定义一个helper来计算差值。
Template.xyz.helpers({
RXSignalODU1difference : function () {
var ODU1gemessen = Session.get("ODU1gemessen");
var ODU1planned = Session.get("ODU1planned");
if (!!ODU1gemessen || !!ODU1planned) {
return ODU1gemessen - ODU1planned;
}
}
});
我的 HTML 标记如下所示。请注意,为了仍然控制表单的顺序,我使用带有一系列 {{> afQuickfields }} 的 {{#autoform}} 而不是使用 {{> 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 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 使用架构中的字段名称分配名称属性,但我不知道它如何处理嵌套键......(即它是否命名元素 'SiteA.Settings.RXSignalODU1' 或只是 'RXSignalODU1' )
然后只需将 html 中某处的值显示为 :
{{diff}}
在我的自动表单中,一个字段的值是另外两个输入字段的差值。不允许用户更新。不幸的是,目前无法在表单中将单个字段设置为只读。所以我的方法是创建一个 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";
}
}
},
我的Simple.Schema留言:
SimpleSchema.messages({noUpdateAllowed: "Can't be updated"});
很遗憾,没有弹出消息。
编辑
此方法将在您的表单中创建一个禁用的输入框,该输入框将在用户键入时自动显示其他两个输入字段之间的差异。
首先,我们为计算中使用的值定义会话变量,并将它们初始化为未定义。
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);
}
});
然后我们定义一个helper来计算差值。
Template.xyz.helpers({
RXSignalODU1difference : function () {
var ODU1gemessen = Session.get("ODU1gemessen");
var ODU1planned = Session.get("ODU1planned");
if (!!ODU1gemessen || !!ODU1planned) {
return ODU1gemessen - ODU1planned;
}
}
});
我的 HTML 标记如下所示。请注意,为了仍然控制表单的顺序,我使用带有一系列 {{> afQuickfields }} 的 {{#autoform}} 而不是使用 {{> 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 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 使用架构中的字段名称分配名称属性,但我不知道它如何处理嵌套键......(即它是否命名元素 'SiteA.Settings.RXSignalODU1' 或只是 'RXSignalODU1' )
然后只需将 html 中某处的值显示为 :
{{diff}}