SAPUI5 - Как я могу получить название модели, к которой привязан мой пользовательский элемент управления?

Я работаю над пользовательским элементом управления в SAPUI5. Цель - круговая диаграмма с кликабельными сегментами. При каждом щелчке по сегменту должно запускаться событие, которое содержит контекст привязки по нажатому сегменту (например, "/testdata/2"). Контекст используется присоединенными функциями, чтобы знать, какой сегмент был нажат (и, например, отображать его имя в метке).

Поскольку функция getBindingContext всегда требует имя модели (или неопределенное) для извлечения текущего контекста, мне пришлось жестко кодировать имя модели ("использование") во время тестирования, чтобы заставить его работать. Однако позже (когда этот элемент управления будет использоваться другими), это имя модели, очевидно, будет отличаться от того, которое я использовал здесь. Итак, как я могу получить текущий контекст привязки, не зная, какое имя имеет связанная модель?

Текущие (соответствующие) реализации являются следующими:

Пример представления XML:

<demo:PieChart id="testchart" segments="{usage>/testdata}">
    <demo:Segment color="{usage>color}" size="{usage>size}"/>
</demo:PieChart>
<Label id="testlabel" text="{usage>name}"/>

Тестовые данные (use.json):

{
    "testdata": [
        {
            "name": "test_name_1",
            "size": 123,
            "color": "rgb(100,140,100)"
        },
        ...
    ]
}

Внутри "Сегмент":

onclick: function(Event) {
    // Hard-coded modelname inside Control, this won't work later :/
    var context = this.getBindingContext("usage").getPath();
    this.getParent().fireSegmentClick({context: context});
}

Внутри "PieChart":

metadata: {
    ...
    aggregations: {
        segments: {
            type: "demo.Segment"
        }
    },
    defaultAggregation: "segments",
    events: {
        segmentClick: {
            enablePreventDefault: true
        }
    }
}

Пример вложения в контроллер:

onInit: function() {
    var chart = this.byId("testchart");
    var label = this.byId("testlabel");
    chart.attachSegmentClick(function(Event) {
        var context = Event.getParameter("context");
        // The user knows the modelname here (he bound it).
        // But how do I get that name inside the Control?
        label.bindObject({path: context, model: "usage"});
    });
}

Моя лучшая попытка: внутри onclick-функции сегмента, которую я могу вызвать

var model = this.getParent().getBinding("segments").getModel();

Это дает мне модель, которую я хочу. Но так как ни model.toString(), ни model.getName() не могут получить мне его имя, это бесполезно (поскольку getBindingContext() не хочет саму модель, но ее имя...)

Любая помощь приветствуется!

PS: некоторые (надеюсь) полезные ссылки:

Обязательная ссылка

Ссылка getBindingContext

Связанный первый ответ

0 ответов

Итак, как я могу получить текущий контекст привязки, не зная, какое имя имеет связанная модель?

Проблема в том, что элемент управления (или ManagedObject) может хранить несколько моделей одновременно, все с разными именами. Таким образом, даже если элемент управления "знает" все имена моделей, будет трудно угадать, какой из доступных связанных контекстов требуется приложению, поскольку их может быть ноль или много.

Технически это, безусловно, возможно, как подсказывает Кришо ответ. Но, на мой взгляд, ответственность за распространение связанного контекста (ов) в приложении не лежит на контроле. Как вы упомянули, только приложение знает все модели и их названия, таким образом, какой контекст он хочет. Ниже мое предложение:

сегмент

onclick: function(oEvent) {
  const parent = this.getParent();
  if (parent && parent.isA("demo.PieChart")) {
    parent.fireSegmentClick({
      segment: this, // deliver the clicked segment instead of some context(s)
    });
  }
},

Круговая диаграмма

metadata: {
  //...
  aggregations: {
    segments: {
      type: "demo.Segment",
    },
  },
  defaultAggregation: "segments",
  events: {
    segmentClick: {
      enablePreventDefault: true,
      parameters: {
        segment: {
          type: "demo.Segment",
        },
      },
    },
  },
},

заявка

onSegmentClick: function(event) {
  const segment = event.getParameter("segment");
  const boundContext = segment.getBindingContext(/*I know the model name*/);
  // ...
},

Это обеспечивает слабую связь между органами управления и приложениями / моделями.

Вы можете попробовать это?

.getBindingInfo("segments").parts[0].model
Другие вопросы по тегам