Survey Creator自定义PanelModel类报错:TypeError: e.isDefaultRendering is not a function
问题分析与解决方案
错误Uncaught (in promise) TypeError: e.isDefaultRendering is not a function的核心原因是:你声明自定义类时继承的是Survey.Question,但你实际想要继承的是PanelModel——isDefaultRendering是PanelModel类的专属方法,Question类并不包含该方法,导致Survey Creator渲染组件时找不到对应方法报错。
以下是修正后的完整实现代码:
const creatorOptions = { showLogicTab: true, isAutoSave: true, }; const creator = new SurveyCreator.SurveyCreator(creatorOptions); // 改为继承Survey.PanelModel,确保拥有面板类的所有方法 class MyCustomClass extends Survey.PanelModel { getType() { return "my-custom-class"; } get myCustomProperty() { return this.getPropertyValue("myCustomProperty"); } set myCustomProperty(val) { this.setPropertyValue("myCustomProperty", val); } } Survey.ElementFactory.Instance.registerElement("my-custom-class", (name) => { return new MyCustomClass(name); }); // Serializer父类参数从"question"改为"panel",匹配继承关系 Survey.Serializer.addClass( "my-custom-class", [{ name: "myCustomProperty", category: "general", visibleIndex: 2 }], function () { return new MyCustomClass(""); }, "panel" ); creator.toolbox.addItem({ name: "my-custom-class", // 与getType()返回值保持一致 title: "自定义面板", iconName: "icon-panel", // 使用面板类对应图标 json: { type: "my-custom-class", name: "panelPersonalizado1", elements: [] }, isCopied: true // 允许拖拽复制到问卷中 }); creator.render("surveyCreatorContainer");
关键修改说明
- 继承类修正:将
extends Survey.Question改为extends Survey.PanelModel,让自定义类继承面板类的所有属性与方法,包括缺失的isDefaultRendering。 - 序列化器父类调整:
Survey.Serializer.addClass的最后一个参数从"question"改为"panel",让SurveyJS的序列化系统正确识别自定义类的父类类型,继承面板的默认行为。 - 标识一致性:确保
getType()返回值、ElementFactory注册名、toolbox配置的name参数完全匹配,避免组件识别异常。
内容的提问来源于stack exchange,提问作者Leonardo Moreno
相关产品推荐
相关产品推荐

