Angular项目SurveyJS Matrix如何使用Bootstrap datepicker自定义日期组件
解决方案
- 首先确认你已经完成Bootstrap Datepicker自定义widget的基础逻辑开发,核心调整点在自定义widget的注册规则和Matrix列配置两个部分:
- 调整自定义widget的适配规则(如果要全局替换所有日期类型,包括Matrix单元格)
在你注册自定义widget的代码中,修改isFit函数的判断逻辑,覆盖Matrix矩阵的日期单元格场景:
import * as Survey from "survey-angular"; // 注册自定义bootstrap datepicker widget Survey.CustomWidgetCollection.Instance.add({ name: "bootstrap-datepicker", title: "Bootstrap Datepicker", iconName: "icon-date", widgetIsLoaded: function () { // 确认bootstrap datepicker依赖已加载 return typeof $().datepicker !== "undefined"; }, isFit: function (question) { // 适配3种场景:普通日期问题、matrixdropdown矩阵的日期单元格、matrixdynamic动态矩阵的日期单元格 return question.getType() === "date" || (question.parentQuestion?.getType() === "matrixdropdown" && question.cellType === "date") || (question.parentQuestion?.getType() === "matrixdynamic" && question.cellType === "date"); }, // 剩下的init、render、afterRender、getValue、setValue等逻辑和你参考的官方普通日期示例完全一致 afterRender: function (question, el) { $(el).find("input").datepicker({ // 你的bootstrap datepicker配置,比如年份导航开启 changeYear: true, changeMonth: true, yearRange: "1900:2099", onSelect: function (date) { question.value = date; } }); }, willUnmount: function (question, el) { $(el).find("input").datepicker("destroy"); } }, "customtype");
- 配置Matrix矩阵的列属性
完成上述注册后,你只需要在Survey的JSON配置中,给需要用日期选择器的Matrix列指定cellType为date即可,会自动适配你注册的Bootstrap Datepicker组件,示例配置如下:
{ "elements": [ { "type": "matrixdynamic", "name": "businessMatrix", "title": "业务信息列表", "columns": [ { "name": "startDate", "title": "开始日期", "cellType": "date" }, { "name": "endDate", "title": "结束日期", "cellType": "date" }, { "name": "content", "title": "业务内容" } ], "rowCount": 2 } ] }
- 如果你不想全局替换所有日期类型,只在Matrix部分单元格使用自定义组件,可以跳过
isFit函数的修改,直接在需要的列配置里把cellType设置为你自定义widget的name值即可,比如上面示例的cellType: "bootstrap-datepicker"。 - 注意要提前在
angular.json中引入Bootstrap Datepicker的相关样式和JS依赖,同时屏蔽jQuery UI Datepicker的默认样式,避免出现控件冲突。
内容的提问来源于stack exchange,提问作者Viswa
相关产品推荐
相关产品推荐

