Sapui5 如何在XML视图中动态加载XML片段?

Sapui5 如何在XML视图中动态加载XML片段?,sapui5,Sapui5,假设我有以下XML视图: 片段my.fragment是静态加载的。但是,我现在希望动态更改要加载的片段(理想情况下使用数据绑定fragmentName属性,但任何其他方法也应该可以),例如: 但是,后者不起作用,而且片段定义不允许数据绑定。。。我可能遗漏了一些东西,但是我应该如何基于参数/模型属性/等等动态地更改XML视图中的片段 现在,我已经求助于自定义控件,而不是在我的视图中直接使用片段,并让该控件对适当的片段进行分派,但我觉得应该有一种更简单、现成的方法…我认为唯一的解决方案将是从

假设我有以下XML视图:


片段
my.fragment
是静态加载的。但是,我现在希望动态更改要加载的片段(理想情况下使用数据绑定
fragmentName
属性,但任何其他方法也应该可以),例如:


但是,后者不起作用,而且片段定义不允许数据绑定。。。我可能遗漏了一些东西,但是我应该如何基于参数/模型属性/等等动态地更改XML视图中的片段


现在,我已经求助于自定义控件,而不是在我的视图中直接使用片段,并让该控件对适当的片段进行分派,但我觉得应该有一种更简单、现成的方法…

我认为唯一的解决方案将是从
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";
    }
});

片段名称也可以由绑定产生,包括计算为常量的表达式绑定。由于格式化程序函数返回字符串,而不是布尔值,因此在以下示例中添加了=='true':

示例:动态片段名称

<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"/>


+1为创意!恐怕处理这个问题的唯一方法是在控制器中进行,这可能更有意义,因为您可以在控制器中管理片段的整个生命周期。谢谢!但是,我认为更好的方法是
onAfterRendering
方法,因为
onInit
只会被调用一次(我的任务的全部目的是重用单个视图并拥有它的内容(片段和/或内部视图)现在不推荐按需更改
sap.ui.xmlfragment
sap.ui.core.Fragment.load()应改为使用
:这不能工作,因为fragmentName不是一个实际属性,而是一个不可绑定的属性。根据文档,这应该可以工作:。但是,我也没有设法让它工作。@SimonTenbeitel不幸的是,没有。该文档主题仅适用于XML模板-一种不太为人所知的concept用于在创建实际控件之前预处理XML视图。这里,但同样地,仅用于XML模板,该模板从未被
路由器直接支持,因此未被应用程序开发人员广泛采用。这个答案完全是错误和误导的。