Ошибка повторяющегося идентификатора при создании фрагментов в разных контроллерах

Итак... Я создаю приложение, которое в основном представляет собой CRUD. В этом приложении у меня есть следующие представления/контроллеры: VisitEdit и RequestNew.

В контроллере RequestNew у меня есть функция, которая обрабатывает нажатие кнопки:

onRequestNewAddCustomerPress: function(oEvent) {
  if( !this.oAddCustomerDialog ){
    this.oAddCustomerDialog = sap.ui.xmlfragment("com.sap.lccapp.fragment.AddCustomer", this);
  }
  this.oAddCustomerDialog.openBy(oEvent.getSource());
},

И у меня на этом же контроллере есть функция onExit. Теперь он пуст, потому что я провел МНОГО тестов с функцией .destroy() этого объекта (oAddCustomerDialog), и ошибка продолжает появляться.


Проблема в; на контроллере VisitEdit, когда я пытаюсь использовать тот же диалог во второй раз с тем же кодом, что и выше, появляется следующая ошибка:

Добавление элемента с повторяющимся идентификатором «addCustomerNameField»

ID "addCustomerNameField" взят из моего первого элемента внутри моего фрагмента.

Хотя у меня есть «проверка if» для обоих методов и поскольку она находится в разных контроллерах, последний проверяемый «if» имеет объект (this.oAddCustomerDialog) undefined (НО ОН НЕ ДОЛЖЕН ИМЕТЬ НЕОПРЕДЕЛЕННОЕ ЗНАЧЕНИЕ), и он снова создает sap.ui.xmlfragment.


Определение фрагмента: http://dontpad.com/stackoverflowquestionsapui5


person Luis Henrique Valgoi    schedule 23.12.2016    source источник


Ответы (1)


Вы можете связать уникальный идентификатор при создании экземпляров фрагментов. Таким образом, этот уникальный идентификатор будет префиксом идентификаторов элемента управления, содержащегося во фрагменте.

Итак, два разных кода будут:

onRequestNewAddCustomerPress: function(oEvent) {
  if (!this.oAddCustomerDialog) {
    this.oAddCustomerDialog = sap.ui.xmlfragment("idOnNewRequest","com.sap.lccapp.fragment.AddCustomer", this);
  }
  this.oAddCustomerDialog.openBy(oEvent.getSource());
},

а потом:

onVisitEditAddCustomerPress: function(oEvent) {
  if (!this.oAddCustomerDialog) {
    this.oAddCustomerDialog = sap.ui.xmlfragment("idOnEdit","com.sap.lccapp.fragment.AddCustomer", this);
  }
  this.oAddCustomerDialog.openBy(oEvent.getSource());
},

Кроме того, проверьте следующий раздел документации: Идентификаторы в декларативных фрагментах XML или HTML

РЕДАКТИРОВАТЬ: Если эти фрагменты вызываются из двух разных представлений, лучше всего использовать идентификатор представления. Я бы изменил код для создания экземпляра фрагмента, как показано ниже:

this.oAddCustomerDialog = sap.ui.xmlfragment(this.getView().getId(), "com.sap.lccapp.fragment.AddCustomer", this);

Начиная с UI5 1.58, заводская функция sap.ui.*fragment устарела. Используйте Fragment.load< /a> вместо этого!

Fragment.load({
  id: this.getView().getId(),
  name: "com.sap.lccapp.fragment.AddCustomer",
  controller: this,
}); // returns a promise
person Rahul Bhardwaj    schedule 24.12.2016