Meteor Autoform-防止字段更新
在我的自动表单中,一个字段的值是其他两个输入字段的差值。用户不允许对其进行更新。不幸的是,目前无法在表单中将单个字段设置为只读。因此,我的方法是创建一个自动值和一个自定义验证来防止更新 到目前为止,我的代码是:Meteor Autoform-防止字段更新,meteor,meteor-autoform,Meteor,Meteor Autoform,在我的自动表单中,一个字段的值是其他两个输入字段的差值。用户不允许对其进行更新。不幸的是,目前无法在表单中将单个字段设置为只读。因此,我的方法是创建一个自动值和一个自定义验证来防止更新 到目前为止,我的代码是: 'SiteA.Settings.RXSignalODU1difference': { type: Number, label: "RX Signal [dBm] ODU1 difference (without ATPC +
'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";
}
}
},
我的简单.Schema消息:
SimpleSchema.messages({noUpdateAllowed: "Can't be updated"});
不幸的是,没有弹出消息。编辑
此方法将在表单中创建一个禁用的输入框,当用户键入时,该框将自动显示其他两个输入字段之间的差异
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.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标记如下所示。注意,为了仍然控制表单的顺序,我使用带有一系列{{>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>
这将在表单中保留此字段,因此用户将无法更新它
如果您仍然希望在用户在其他两个值中键入值时在表单的某个位置显示该值,则可以在客户端js中定义一个帮助器
差不多
{{>quickForm collection='yourCollection' omitFields='SiteA.Settings.RXSignalODU1difference'}}
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属性,但我不知道它如何处理嵌套键。。。(即它是将元素命名为“SiteA.Settings.RXSignalODU1”还是仅命名为“RXSignalODU1”)
然后只需在html中的某个位置显示值,如下所示:
{{diff}}
嗨,谢谢你的回复。如果我不关心表单项的显示顺序,那么您的解决方案听起来不错。我的方法略有不同,使用jquery并在模板呈现函数中添加“.attr”(“disabled”,true)”。这不是最好的方法,但就我的情况和用户体验而言还行。我一直在做更多的研究来解决类似的问题,我认为如果你想要{{diff},这可能不是最好的方法我的新方法包括为每个输入字段定义一个keyup事件,并设置一个会话变量,该变量随着每次按键而更新。然后,在helper中,我只检索两个会话变量并计算差异。今天晚些时候我可以发布一个工作示例。