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

Я работаю над пользовательским элементом управления в 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

Соответствующий первый ответ

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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

Проблема в том, что элемент управления (или 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)
    });
  }
},

PieChart

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*/);
  // ...
},

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

0 голосов
/ 03 марта 2019

Можете ли вы попробовать это?

.getBindingInfo("segments").parts[0].model
...