SAPUI5 - 如何获取我的自定义控件绑定到的模型的名称?
SAPUI5 - How can I get the name of the model to which my Custom Control has been bound?
我正在 SAPUI5 中开发自定义控件。目标是带有可点击部分的饼图。每当单击一个段时,应触发一个事件,其中包含单击段的绑定上下文(例如“/testdata/2”)。附加函数使用上下文来了解单击了哪个段(例如,在标签中显示其名称)。
由于函数 getBindingContext 总是需要模型名称(或未定义的)来提取当前上下文,因此我必须在测试期间对模型名称 ("usage") 进行硬编码才能使其正常工作。但是稍后(当其他人使用此控件时)该模型名称将明显与我在这里使用的不同。那么如何在不知道绑定模型的名称的情况下获取当前绑定上下文呢?
当前(相关)实现如下:
示例XML视图:
<demo:PieChart id="testchart" segments="{usage>/testdata}">
<demo:Segment color="{usage>color}" size="{usage>size}"/>
</demo:PieChart>
<Label id="testlabel" text="{usage>name}"/>
测试数据(usage.json):
{
"testdata": [
{
"name": "test_name_1",
"size": 123,
"color": "rgb(100,140,100)"
},
...
]
}
里面 "Segment":
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: {
allowPreventDefault: 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-function 中,我可以调用
var model = this.getParent().getBinding("segments").getModel();
这让我得到了我想要的模型。但是由于 model.toString() 或 model.getName() 都不能给我它的名字,所以这是没有用的(因为 getBindingContext() 不想要模型本身,而是它的名字......)
感谢任何帮助!
PS:一些(希望)有用的链接:
你能试试这个吗?
.getBindingInfo("segments").parts[0].model
So how can I get the current binding context without knowing which name the bound model has?
问题是一个控件(或 ManagedObject)可以同时存储 多个模型,所有模型都具有不同的名称。因此,即使控制 "knows" 所有模型名称,也很难猜出应用程序需要哪个可用绑定上下文,因为它们可能有零个或多个。
从技术上讲,正如 krisho 的回答所暗示的那样,这肯定是可能的。但在我看来,将绑定上下文传播到应用程序不是控件的责任。正如您提到的,只有应用程序知道所有模型及其名称,因此,它需要什么样的上下文。以下是我的建议:
控件
段
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: {
allowPreventDefault: true,
parameters: {
segment: {
type: "demo.Segment",
},
},
},
},
},
申请
onSegmentClick: function(event) {
const segment = event.getParameter("segment");
const boundContext = segment.getBindingContext(/*I know the model name*/);
// ...
},
这使得控件和 application/models 之间的松散耦合成为可能。
我正在 SAPUI5 中开发自定义控件。目标是带有可点击部分的饼图。每当单击一个段时,应触发一个事件,其中包含单击段的绑定上下文(例如“/testdata/2”)。附加函数使用上下文来了解单击了哪个段(例如,在标签中显示其名称)。
由于函数 getBindingContext 总是需要模型名称(或未定义的)来提取当前上下文,因此我必须在测试期间对模型名称 ("usage") 进行硬编码才能使其正常工作。但是稍后(当其他人使用此控件时)该模型名称将明显与我在这里使用的不同。那么如何在不知道绑定模型的名称的情况下获取当前绑定上下文呢?
当前(相关)实现如下:
示例XML视图:
<demo:PieChart id="testchart" segments="{usage>/testdata}">
<demo:Segment color="{usage>color}" size="{usage>size}"/>
</demo:PieChart>
<Label id="testlabel" text="{usage>name}"/>
测试数据(usage.json):
{
"testdata": [
{
"name": "test_name_1",
"size": 123,
"color": "rgb(100,140,100)"
},
...
]
}
里面 "Segment":
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: {
allowPreventDefault: 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-function 中,我可以调用
var model = this.getParent().getBinding("segments").getModel();
这让我得到了我想要的模型。但是由于 model.toString() 或 model.getName() 都不能给我它的名字,所以这是没有用的(因为 getBindingContext() 不想要模型本身,而是它的名字......)
感谢任何帮助!
PS:一些(希望)有用的链接:
你能试试这个吗?
.getBindingInfo("segments").parts[0].model
So how can I get the current binding context without knowing which name the bound model has?
问题是一个控件(或 ManagedObject)可以同时存储 多个模型,所有模型都具有不同的名称。因此,即使控制 "knows" 所有模型名称,也很难猜出应用程序需要哪个可用绑定上下文,因为它们可能有零个或多个。
从技术上讲,正如 krisho 的回答所暗示的那样,这肯定是可能的。但在我看来,将绑定上下文传播到应用程序不是控件的责任。正如您提到的,只有应用程序知道所有模型及其名称,因此,它需要什么样的上下文。以下是我的建议:
控件
段
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: {
allowPreventDefault: true,
parameters: {
segment: {
type: "demo.Segment",
},
},
},
},
},
申请
onSegmentClick: function(event) {
const segment = event.getParameter("segment");
const boundContext = segment.getBindingContext(/*I know the model name*/);
// ...
},
这使得控件和 application/models 之间的松散耦合成为可能。