2014-09-06 51 views
3

假設我有下面的XML視圖:如何在XML視圖中動態加載XML片段?

<core:View xmlns:core="sap.ui.core" ...> 
    <Page> 
     <content> 
      <l:VerticalLayout> 
       <l:content> 
        <core:Fragment fragmentName="my.static.Fragment" type="XML" /> 
       </l:content> 
      </l:VerticalLayout> 
     </content> 
    </Page> 
</core:View> 

片段my.Fragment被靜態加載。但是,我現在想要動態更改要加載的片段(理想情況下使用數據綁定fragmentName屬性,但其他任何方法也應該可以),即。是這樣的:

<core:View xmlns:core="sap.ui.core" ...> 
    <Page> 
     <content> 
      <l:VerticalLayout> 
       <l:content> 
        <core:Fragment fragmentName="{/myDynamicFragment}" type="XML" /> 
       </l:content> 
      </l:VerticalLayout> 
     </content> 
    </Page> 
</core:View> 

然而,後者不工作,和碎片定義不允許使用數據綁定......我可能會錯過一些東西,但我應該如何動態地更改片段在我的XML視圖基於參數/模型屬性/ etc?

現在,我使用了一個自定義控件,而不是直接在視圖中使用片段,並讓該控件調度到相應的片段,但我覺得應該有一個更容易,開箱方式...

+3

+1的想法!恐怕解決這個問題的唯一方法就是在控制器中執行它,這可能更有意義,因爲您可以管理片段的整個生命週期。 – 2014-09-08 06:59:40

回答

4

我認爲唯一的解決方案將是片段的初始化從onInit方法控制器:

sap.ui.controller("my.controller", { 
    onInit : function(){ 
     var oLayout = this.getView().byId('mainLayout'), //don't forget to set id for a VerticalLayout 
      oFragment = sap.ui.xmlfragment(this.fragmentName.bind(this)); 
     oLayout.addContent(oFragment); 
    }, 

    fragmentName : function(){ 
     return "my.fragment"; 
    } 
}); 
+1

謝謝!然而,我認爲一個更好的地方是'onAfterRendering'方法,因爲'onInit'只會被調用一次(我的任務的全部目的是重用單個視圖,並且它的內容(片段和/或內部視圖)按需改變 – Qualiture 2014-09-08 21:44:08

0

片段名稱也可以從結合導致,包括表達結合其評估爲一個常數。作爲格式化函數返回的字符串,而不是布爾值,===「真」已經在下面的例子中補充說:

例如:動態片段名稱

<core:Fragment fragmentName="{= ${path: 'facet>Target', formatter: 'sap.ui.model.odata.AnnotationHelper.isMultiple'} === 'true' 
    ? 'sap.ui.core.sample.ViewTemplate.scenario.TableFacet' 
    : 'sap.ui.core.sample.ViewTemplate.scenario.FormFacet' }" type="XML"/>