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