我对加载片段有一点具体的问题。
我们在表单框架中动态加载片段,它只使用表单bean定义生成带有Java反射的表单。在处理关闭表单标记(</form>
)之后,处理加载的片段(不知道原因)。因为我们只从所选表格的开头到结束标签进行表格上下文(因为更多的表格可能在同一页面上),所以发生异常,而加载的片段的处理被百里香叶推迟。
加载片段的代码:
public static List<Node> loadFragment(Arguments arguments, String fragmentName, String fragmentPath) {
IFragmentSpec fragmentSpec = new ElementAndAttributeNameFragmentSpec(null, "th:fragment", fragmentName, true);
FragmentAndTarget fat = new FragmentAndTarget(fragmentPath, fragmentSpec);
return fat.extractFragment(arguments.getConfiguration(), arguments, arguments.getTemplateRepository());
}
此代码在InitializerElProcessor
中调用,其中整个表单构建为html。
碎片按原样加载,但它不是由百日咳处理的。如何加载由thymeleaf处理过的片段?或者我们应该如何强制百里香叶立即处理这个节点(加载的结果)?
感谢您的任何想法。
答案 0 :(得分:0)
经过几个小时的调试后我发现了它
当我提取片段内容并将其附加到DOM树中的当前已处理元素时,将跳过所有新嵌套节点(更好的是,跳过第一个节点,并且使用该节点,也会跳过其所有子节点)。当遍历继续时(第4点),这部分代码在Node
class:
void processNode(final Arguments arguments, final boolean processTextNodes, final boolean processCommentNodes) {
// some code
if (!isPrecomputed()) {
precomputeNode(arguments.getConfiguration());
}
if (!isSkippable()) {
// processing itself
...
// move processing to children, but does not happend if node is marked as skippable
doAdditionalProcess(executionArguments, executionArguments.getProcessTextNodes(), executionArguments.getProcessCommentNodes());
}
}
由于从片段中提取的节点未标记为precomputed
,因此precomputeNode
方法如下:
final void precomputeNode(final Configuration configuration) {
if (!isPrecomputed()) {
this.processors = configuration.computeProcessorsForNode(this);
if (this.processors == null || this.processors.size() == 0) {
this.skippable = true;
} else {
unsafeSetSkippable(false);
}
setPrecomputed(true);
}
doAdditionalPrecomputeNode(configuration);
}
由于节点未标记为precomputed
,因此调用方法computeProcessorsForNode()
。此方法返回null
,然后节点标记为skippable
。正如评论所说,当前节点的兄弟节点应该在doAdditionalPrecomputeNode()
方法中将此节点设置为不可跳过。 不幸的是,这不会发生。
经过一些调试后我发现,在片段的所有提取节点上都必须调用方法node.setProcessable(true);
,以避免将第一个节点设置为skippable
。
我仍然不知道这是一个错误或功能..