2013-04-17 83 views
1

我對加載片段有一點特定的問題。處理加載片段

我們動態地在我們的表單框架中加載片段,它們只是從表單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

我發現它的調試小時後..
當我做提取片段內容,並追加到DOM樹當前處理的元素,所有新的嵌套的節點被跳過(更好的,第一點被跳過,並與節點,它的所有子節點也被跳過)。

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

因爲節點時橫移繼續(點4),這部分代碼在Node類進行處理沒有標記爲precomputed,則調用方法computeProcessorsForNode()。此方法返回null,然後將節點標記爲skippable。如註釋所示,當前節點的同胞應該在doAdditionalPrecomputeNode()方法中將此節點設置爲不可跳過。 不幸的是,這並沒有發生。

經過一些調試後,我發現,在所有從片段提取的節點上,必須調用方法node.setProcessable(true);以避免將第一個節點設置爲skippable。 我仍然不知道這是一個錯誤還是功能..