Как получить доступ к элементам из 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, /*...*/) { /*...*/});
Заметка
Ответ 3
Чтобы он работал без явного идентификатора фрагмента и без статического Fragment.byId(), я использовал следующий фрагмент кода:
var prefix = this.getView().createId("").replace("--", "");
var fragment = sap.ui.xmlfragment(prefix, "-- XML fragment name --", this);
после этого вы можете использовать this.getView(). byId ( "tab1" ), как и любой другой элемент управления.