2014-09-06 78 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"/>