1

我对加载片段有一些具体的问题。

我们在表单框架中动态加载片段,它仅从表单 bean 定义生成带有 Java 反射的表单。事情是处理加载的片段(不知道为什么),在处理关闭表单标签之后(</form>)。因为我们只在所选表单的开始标签到结束标签中携带表单上下文(因为同一页面上可能有更多表单),所以会发生异常,而 thymeleaf 会推迟加载片段的处理。

加载片段的代码:

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 处理。如何加载已由百里香处理的片段?或者我们应该如何强制 thymeleaf 立即处理这个节点(加载的结果)?

感谢您的任何想法。

4

1 回答 1

0

经过数小时的调试,我找到了它。
当我提取片段内容并将其附加到 DOM 树中的当前已处理元素时,将跳过所有新的嵌套节点(更好的是,跳过第一个节点,并且使用该节点,它的所有子节点都是也跳过)。当遍历继续时(第 4 点),这部分代码在Node类中处理:

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()); 
    } 
} 

因为从fragment中提取的节点没有标记为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); 
} 

因为 node 没有被标记为precomputed,所以方法computeProcessorsForNode()被调用。此方法返回null,然后将节点标记为skippable。正如评论所说,当前节点的兄弟姐妹应该在方法中将此节点设置为不可跳过doAdditionalPrecomputeNode()不幸的是,这不会发生。

经过更多调试后,我发现,必须在从片段中提取的所有节点上调用方法node.setProcessable(true);以避免将第一个节点设置为skippable. 我仍然不知道这是一个错误还是功能..

于 2013-05-28T19:22:54.143 回答