You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:28:04