2014-09-06 1 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 за идею! Я боюсь, что единственный способ справиться с этим - это сделать это в контроллере, который, вероятно, имеет больше смысла, поскольку вы можете управлять всем жизненным циклом фрагмента. –

ответ

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

0

название фрагмента также может быть результатом связывания, включая выражение связывания, которое оценивается константой. Так как функции Formatter возвращают строки, а не булевы, === «истина» была добавлена ​​в следующем примере:

Пример: Динамический Фрагмент Название

<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"/> 
Смежные вопросы