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

フラグメントから抽出されたノードは としてマークされていないためprecomputedprecomputeNodeメソッドは次のようになります。

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、 methodcomputeProcessorsForNode()が呼び出されます。このメソッドが を返すnullと、ノードは としてマークされskippableます。コメントが示すように、現在のノードの兄弟は、このノードをdoAdditionalPrecomputeNode()メソッドでスキップ不可として設定する必要があります。残念ながら、これは起こりません。

さらにデバッグした後、フラグメントから抽出されたすべてのノードでメソッドnode.setProcessable(true);を呼び出して、最初のノードが として設定されないようにする必要があることがわかりましたskippable。これがバグなのか機能なのかはまだわかりません..

于 2013-05-28T19:22:54.143 に答える