在SAP UI5中,当用户按下它时,我尝试获取绑定到表行的数据对象(在我的控制器中)。我的视图是用XML定义的,我的控制器当然是在JS中。
我已经检查了How to get content of a row in sap.m.table,但它对我不起作用,或者缺少某些东西。
我的观点(相关部分):
<Panel>
<Table id="lineItemList" items="{
path: 'statusJobs>/jobs',
sorter: {
path: 'start',
descending: true
}
}">
<headerToolbar>
<!-- ... -->
</headerToolbar>
<columns>
<Column hAlign="Left" vAlign="Middle">
<Label text="Job" />
</Column>
<Column hAlign="Center" vAlign="Middle">
<Label text="Start" />
</Column>
<Column hAlign="Center" vAlign="Middle">
<Label text="End" />
</Column>
<Column hAlign="Right" vAlign="Middle">
<Label text="Success" />
</Column>
</columns>
<ColumnListItem
type="Navigation"
press=".handleLineItemPress"
>
<Text text="{statusJobs>job}" />
<Text text="{
path: 'statusJobs>start',
formatter:'util.Formatter.Date'}"
/>
<Text text="{
path: 'statusJobs>end',
formatter: 'util.Formatter.Date'}"
/>
<Text text="{statusJobs>status}"/>
</ColumnListItem>
</Table>
这里的相关部分显然是:
<ColumnListItem
type="Navigation"
press=".handleLineItemPress"
>
在我的控制器中,我有这个:
handleLineItemPress: function(evt) {
console.log('evt.getSource: ' + evt.getSource());
console.log('evt.getBindingContext: ' + evt.getSource().getBindingContext());
}
其记录如下:
evt.getSource:Element sap.m.ColumnListItem #__ item11-StatusJobs - lineItemList-0 evt.getBindingContext:undefined
evt.getSource
返回ColumnListItem,因此当然,我可以使用对象层次结构并获取单元格的文本,如:
evt.getSource().getCells()[0].getText();
但这似乎并不是正确的方式,特别是不提供整个对象或其唯一ID,我碰巧没有在表中显示。
我在某种程度上错过了回到我的数据模型的连接,我之前在代码中绑定了<Table>
项目,如下所示:
items="{
path: 'statusJobs>/jobs',
sorter: {
path: 'start',
descending: true
}
}"
我不想这么说,但我遇到了同样的问题,我花了很长时间才找到原因......
这些都与命名模型的使用有关,在你的情况下statusJobs
。
如果要检索绑定到命名属性的项的绑定上下文,由于某种原因(老实说,我想不出任何),您还必须指定命名模型:
evt.getSource().getBindingContext("statusJobs");
将返回正确的绑定上下文。
因此,要检索绑定到按下的行项目的实际对象,您可以使用:
var obj = evt.getSource().getBindingContext("statusJobs").getObject();
由于上下文不能绑定到多个模型(据我所知),我真的不明白为什么你需要专门给出命名的模型名称作为参数,但是现在我想我们必须忍受这种行为