DevExpress表单自定义模板中form.getEditor('CheckInToDate')返回undefined的问题
DevExpress表单自定义模板中form.getEditor('CheckInToDate')返回undefined的问题
嗨,我之前也碰到过这个情况,其实原因很直白:当你给DevExpress Form的item使用自定义template时,Form组件并不会自动把你在模板里创建的dxDateBox实例和该item的dataField绑定起来。Form的getEditor()方法只能找到那些由Form自动创建的编辑器(也就是没用到自定义template,仅通过editorType/editorOptions配置的编辑器),所以你调用form.getEditor('CheckInToDate')自然会返回undefined。
给你两种可行的解决方案,根据你的需求选就行:
方案一:放弃自定义template,用Form原生配置(推荐)
这是最符合Form设计逻辑的做法,不用自定义template,直接通过Form的item配置来设置编辑器和校验规则,这样Form会自动管理编辑器实例,getEditor()就能正常拿到对象了。修改后的代码如下:
$(function () { const formData = {}; const form = $("#formContainer") .dxForm({ formData: formData, items: [ { itemType: "group", colCount: 2, items: [ { dataField: "CheckInFromDate", label: { text: "Check-In from" }, editorType: "dxDateBox", editorOptions: { showClearButton: true, displayFormat: "dd/MM/yyyy", onValueChanged: function (e) { const minDate = e.value; // 现在能正常获取到ToDate的编辑器实例了 const toDateEditor = form.getEditor("CheckInToDate"); toDateEditor.option("min", minDate); toDateEditor.option("disabled", !minDate); }, }, validationGroup: "checkInValidator", validationRules: [ { type: "required", message: "At least one valid date pair is required.", }, ], }, { dataField: "CheckInToDate", label: { text: "To" }, editorType: "dxDateBox", editorOptions: { showClearButton: true, displayFormat: "dd/MM/yyyy", disabled: true, }, validationGroup: "checkInValidator", validationRules: [ { type: "required", message: "At least one valid date pair is required.", }, ], }, ], }, ], }) .dxForm("instance"); });
这种方式不仅解决了getEditor()的问题,代码也更简洁,还能保证Form和编辑器的联动逻辑正常。
方案二:如果一定要用自定义template,手动保存编辑器实例
要是你因为某些原因必须用自定义template,那可以自己在闭包中存储编辑器实例,绕过Form的getEditor()限制。具体做法是:
$(function () { const formData = {}; // 定义变量存储ToDate的编辑器实例 let checkInToDateEditor; const form = $("#formContainer") .dxForm({ formData: formData, items: [ { itemType: "group", colCount: 2, items: [ { dataField: "CheckInFromDate", label: { text: "Check-In from" }, template: function (data, $itemElement) { const editorTemplate = $("<div>").dxDateBox({ showClearButton: true, displayFormat: "dd/MM/yyyy", onValueChanged: function (e) { const minDate = e.value; // 直接用提前保存的实例操作 checkInToDateEditor.option("min", minDate); checkInToDateEditor.option("disabled", !minDate); }, }); editorTemplate .dxValidator({ validationGroup: "checkInValidator", validationRules: [ { type: "required", message: "At least one valid date pair is required.", }, ], }) .appendTo($itemElement); return editorTemplate.dxDateBox("instance"); }, }, { dataField: "CheckInToDate", label: { text: "To" }, template: function (data, $itemElement) { const editor = $("<div>") .dxDateBox({ showClearButton: true, displayFormat: "dd/MM/yyyy", disabled: true, }) .dxValidator({ validationGroup: "checkInValidator", validationRules: [ { type: "required", message: "At least one valid date pair is required.", }, ], }) .appendTo($itemElement) .dxDateBox("instance"); // 将实例存入变量,供后续调用 checkInToDateEditor = editor; return editor; }, }, ], }, ], }) .dxForm("instance"); });
这里要注意,你原来的模板里写了dataField: "CheckInFromDate2",这个其实是多余的,因为自定义模板里的dataField不会和Form的formData关联,反而容易造成混淆,建议去掉。
备注:内容来源于stack exchange,提问作者Li Chang
相关产品推荐
相关产品推荐

