Как получить доступ к элементам из фрагмента 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)
- В XMLView:
- глобальный 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"), как и любой другой элемент управления.