spring-mvc - Thymeleaf 带有片段的自定义方言
问题描述
在我的 Spring Boot 2 项目中,我有 Thymeleaf 片段来生成表单元素。例如:
<input th:replace="component/admin_form :: text (formElement = ${vm.getElementStatus()}, class='css-class-a'))" />
上面的代码生成了一个带有标签、输入字段和错误块的复杂 div 块。
我想简化这种语法。我的想法是创建一个带有自定义标签的自定义方言并编写以下代码:
<admin-form:text value="${vm.getElementLastName()}" class="css-class-a"/>
第二个更容易阅读,它清楚地向设计师表明这是一个特殊的元素。除此之外,更改主题会更容易,因为我只需要更改标签处理器中的具体片段位置,而不是数百个 th:replace 值。
同样重要的是,我不想在标签处理器中构建复杂的 html 布局,只想以某种方式导入片段。所以设计者可以在不修改java代码的情况下修改html片段。
我能够创建自定义方言并创建生成 html 块的自定义标记:
@Override
protected void doProcess(ITemplateContext context, IProcessableElementTag tag, IElementTagStructureHandler structureHandler) {
final IModelFactory modelFactory = context.getModelFactory();
final IModel model = modelFactory.createModel();
model.add(modelFactory.createOpenElementTag("div", "class", "test"));
model.add(modelFactory.createText("This is my custom element"));
model.add(modelFactory.createCloseElementTag("div"));
structureHandler.replaceWith(model, false);
}
但我不知道如何在我的自定义标签中导入片段。
有可能吗?
解决方案
doProcess
您的标签<admin-form:text>
可以创建一个具有th:replace
包含“复杂输入”片段的属性的虚拟标签:
Map<String, String> attributes = new HashMap<>();
attributes.put("th:replace", "/pathToMyFragment/complexInput::myfragname");
IOpenElementTag newTag = modelFactory.createOpenElementTag("div", attributes, AttributeValueQuotes.DOUBLE, false);
model.replace(0, newTag);
或类似的东西(注意关闭标签等)。
结果将是替换
<admin-form:text/>
和
<div th:replace="/pathToMyFragment/complexInput::myfragname"></div>
这反过来将被处理成最终的 HTML。例如,如果您需要保留原始标签属性(如class="css-class-a"
),您可以从原始标签中获取它们model.get(0).getAttributeMap()
并将它们添加为局部变量 withstructureHandler.setLocalVariable("originalAttributes", theAttributeMap);
以在最终片段中使用。
推荐阅读
- javascript - 使用 React 查询小型天气应用程序的字符串
- android - Android 意图在 ChromeOS 上的 Chrome 中打开链接
- django - 如何使某个模板仅对 Django 中已确认的用户可见?
- android - Qpython3.6 - 使用androidhelper模块,得到意想不到的结果
- html - 如何使用 flexbox 在两行中的每一行中创建 3 个框?
- excel - 更新 VBA 代码以查找部分文件名而不是确切文件名
- python - 由于 pyspark 惰性评估导致的错误
- mysql - 如何替换一个字段中的两个子字符串并将结果插入MySQL中的另一个字段
- matlab - 我想制作一个 17 X 12 列的矩阵,或者我可以说,我想将以下元素迭代 17 次
- windows - 假设应用程序受到 RAM 的限制,在 Windows 上运行 64 位而不是 32 位应用程序有多大好处?