Как получить доступ к элементам из XML-фрагмента по идентификатору

Я работаю над приложением SAPUI5. У меня есть представление XML, которое содержит XML- фрагмент и кнопку для сохранения.

Фрагмент содержит несколько элементов управления, таких как раскрывающееся меню, текстовое поле и таблица. Когда я нажимаю кнопку сохранения, мне нужно получить все строки в таблице и вызвать службу обновления OData.

Проблема заключается в методе onSave в представлении контроллера. Я получаю сообщение об ошибке при доступе к таблице с помощью идентификатора. Может ли кто-нибудь помочь мне и советам, как я могу получить доступ к элементам управления, используемым в фрагментах по их идентификатору в контроллере?

Вот фрагмент кода:

---- Посмотреть

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core" xmlns:form="sap.ui.layout.form" xmlns="sap.m">
  <Page>
    ...
    <form:SimpleForm>
      <core:Fragment id ="fr1" fragmentName="first" type="XML"/>
      <Button id="id1" press="onSave"/>
    </form:SimpleForm>
  </Page>
</mvc:View>

---- Определение фрагмента

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Table id="tab1" mode="MultiSelect">
    ...
  </Table>
</core:FragmentDefinition>

---- Контроллер

sap.ui.controller("view", {
  onSave: function() {
    //var tab = this.getView().byId("tab1"); // Not working
    var tab  = sap.ui.getCore().byId("tab1"); // Not working
  },
  // ...
});

Ответ 1

Глядя на код openui5 в github, кажется, что Фрагмент делегирует генерирование локального id содержащемуся представлению, если сам <Fragment/> имеет явный идентификатор не.

Итак, ваш код this.getView().byId("tab1") должен работать, как только вы удаляете атрибут id="fr1" из вашего элемента <Fragment/>.

При использовании явных идентификаторов существует метод static Fragment.byId() для извлечения элемента управления. Я думаю, вы должны использовать его так:

var fragmentId = this.getView().createId("fr1");
var tab = sap.ui.core.Fragment.byId(fragmentId, "tab1");

Ответ 2

Доступ к элементам управления внутри фрагмента зависит от того, как был создан ваш фрагмент. Вот список случаев с соответствующим API для использования для получения контрольной ссылки:

API для использования

this.byId("controlId");
  • Когда фрагмент был создан с идентификатором вида:

    sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this); // deprecated *
    <core:Fragment fragmentName="my.Fragment" type="XML" />
    <!-- View ID will be automatically propagated in XMLView -->
  • Глобальный идентификатор: "componentId---viewId--controlId" **

this.byId(Fragment.createId("fragmentId", "controlId"));
  • Когда идентификатор вида и фрагмент ID получили:

    sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this); // deprecated *
    <core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/>
  • Глобальный идентификатор: "componentId---viewId--fragmentId--controlId" **

Fragment.byId("fragmentId", "controlId");
  • Если только идентификатор фрагмента:

    sap.ui.xmlfragment("fragmentId", "my.Fragment", this); // deprecated *
  • Глобальный идентификатор: "fragmentId--controlId"

sap.ui.getCore().byId("controlId");
  • Когда идентификаторы не были указаны:

    sap.ui.xmlfragment("my.Fragment", this); // deprecated *
    // All control IDs within the fragment gets registered globally without any prefixes!!
    
  • Глобальный идентификатор: "controlId"


*: sap.ui.*fragment API sap.ui.*fragment устарел. Вместо этого используйте Fragment.load (доступно с 1.58).

**: Идентификатор компонента не будет частью глобального идентификатора, если для представления не было указана стабильная идентификация. В этом случае глобальный идентификатор начинается с сгенерированного идентификатора вида: "__xmlview0--...".


Дано

  • this: Ссылка на экземпляр контроллера
  • Fragment: имя параметра для разрешенного модуля, заданное определением зависимости

    sap.ui.define([ // or .require
      "sap/ui/core/Fragment",
      // ...
    ], function(Fragment, /*...*/) { /*...*/});
    

Заметка

  • Избегайте конкатенировать идентификационные части или полагаться на синтаксис глобального идентификатора, как указано в комментарии, а также в документации:

    Не полагайтесь на конкретном синтаксис префикса, поскольку он может измениться в каком - то момент. Всегда используйте такие методы, как byId() и createId().

  • Подумайте о том, чтобы избежать использования вышеуказанных API-интерфейсов, когда намерение фактически должно изменить некоторые данные, которые используются в элементах управления фрагментами (например, myManuallyAccessedInput.setValue("...")). Вместо этого используйте привязку данных ⇒ Изменения в модели будут отражены в пользовательском интерфейсе автоматически.

Ответ 3

Чтобы он работал без явного идентификатора фрагмента и без статического Fragment.byId(), я использовал следующий фрагмент кода:

var prefix = this.getView().createId("").replace("--", "");
var fragment = sap.ui.xmlfragment(prefix, "-- XML fragment name --", this);

после этого вы можете использовать this.getView(). byId ( "tab1" ), как и любой другой элемент управления.