Пользовательский элемент управления UI5, привязка данных не работает при использовании в таблице - PullRequest
2 голосов
/ 04 мая 2020

У меня проблемы с привязкой данных моего пользовательского элемента управления.

Мой элемент управления наследуется от sap.m.Input и расширяет его специальным помощником значений.
Одним из моих новых свойств нового элемента управления является простой заголовок для диалогового окна помощи значения. Это связано с моделью i18n.

Когда я теперь использую свой элемент управления в нормальной форме, все работает. Заголовок привязан правильно и показывает значение привязанного свойства i18n в этой модели. Если я использую свой элемент управления в качестве шаблона в столбце элемента управления sap.ui.table, он показывает только значение по умолчанию для свойства title. Привязка данных, похоже, не работает. Но все еще работает над унаследованными свойствами (такими как значение).

Для упрощения здесь мой элемент управления, который теперь имеет только это свойство заголовка, и если запрашивается значение helphelp, отображает текущее значение в окне предупреждения. В таблице показано значение по умолчанию. И без таблицы, он показывает связанное значение из модели i18n.

Вот упрощенный управляющий код:

sap.ui.define([
  "sap/ui/core/Control",
  "sap/m/Input",
], function(Control, Input) {
  "use strict";

  return Input.extend("DvpClsSuggestInput", {
    "metadata": {
        "properties": {
          // Title of Value-Help Dialog
          "vhTitle": {
            type: "string",
            defaultValue: "Title"
          }
        }
      },

      init: function() {
        Input.prototype.init.call(this);
        this.setShowValueHelp(true);
        this.attachValueHelpRequest(this.onValueHelpRequest.bind(this));
      },

      onValueHelpRequest: function(oEvent) {
        var lvTitle = this.getVhTitle();
        alert(lvTitle);
      },

    });
  });
});

Использование в sap.ui.table.Table (которое не работает и показывает значение по умолчанию свойства title):

<table:Column>
  <m:Label text="{i18gn>HausWaehrung}" />
  <table:template>
    <dvp:MyInput
      value="{ path : 'Inv>Hwaer', type : 'sap.ui.model.type.String' }"
      vhTitle="{i18n>Currency}" />
  </table:template>
</table:column>         

Использование, которое работает:

<VBox>
  <dvp:MyInput
    value="{
      path: 'Cls>/Currency',
      type: 'sap.ui.model.type.String'
    }"
    vhTitle="{i18n>Currency}" />
</VBox>

Еще раз, привязка к свойству value работает в обоих направлениях. Проблема существует только с моей собственностью vhTitle. Любые идеи приветствуются.

1 Ответ

0 голосов
/ 05 мая 2020

Вот рабочий пример: https://embed.plnkr.co/Va7C1BpyiV1jEV87

В общем: объект слушателя должен всегда передаваться как аргумент вместо использования bind:

this.attachValueHelpRequest(this.onValueHelpRequest<strike>.bind(this)</strike><strong>, this</strong>);

В нашем случае: слушатель может быть полностью опущен:

this.attachValueHelpRequest(this.onValueHelpRequest);

Затем инфраструктура будет передавать текущего поставщика событий (экземпляр элемента управления) в качестве объект слушателя, как описано в справочнике API:

Если не указан, функция обработчика вызывается в контексте поставщика событий. (источник)


Почему .bind(this) иногда не работает

Если элемент управления предоставляется как шаблонный элемент управления (например, в * 1032) * как показано в вопросе), UI5 клонирует этот шаблон, используя clone API, в котором также учитываются все зарегистрированные обработчики событий (код) .

Когда обработчик событий был зарегистрирован в init, thisArg в this.onValueHelpRequest.bind(<em>thisArg</em>) был элементом управления шаблоном, не экземпляром клона, который имеет все привязки.
Что еще хуже, bind не позволит вам изменить ранее переданный thisArg , даже если фреймворк попытается call функции потом с другим thisArg в соответствии с spe c (см. Примечание 2).

Это приводит к получению старых значений из шаблона, а не фактических значений из визуализированных клонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...