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

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

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

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

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

---- View

<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
  },
  // ...
});

3 ответов


глядя на код openui5 в github, кажется, что фрагмент делегирует генерацию локального идентификатора содержащему представлению, если тут не имеют явный идентификатор.

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

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

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

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

дано

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

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

API для Использовать

this.byId("controlId");

  • когда фрагмент был создан с просмотр ID (который неявно задается в представлениях XML):
    • В XMLView:<core:Fragment fragmentName="my.Fragment" type="XML" /> или
    • В Контроллере: sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this)
  • глобальный ID:"componentId---viewId--controlId" [1]

this.byId(Fragment.createId("fragmentId", "controlId"));

  • когда просмотр ID и a фрагмент ID дали:
    • <core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/> или
    • sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this)
  • глобальный ID:"componentId---viewId--fragmentId--controlId" [1]

Fragment.byId("fragmentId", "controlId");

  • , когда фрагмент ID только: sap.ui.xmlfragment("fragmentId", "my.Fragment", this)
  • глобальный ID:"fragmentId--controlId"

sap.ui.getCore().byId("controlId");

  • когда идентификаторы не были даны:sap.ui.xmlfragment("my.Fragment", this)
  • глобальный ID: "controlId"

Примечание

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

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

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

[1]: идентификатор компонента не будет частью глобального ID, если нет стабильный ID было дано для просмотра. В таком случае, глобальный ID начинается с сгенерированного ID представления:"__xmlview0--...".


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

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

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