我写了一个XML视图。里面有一张桌子:
<Table xmlns="sap.m"
id="myTable"
select=""
selectionChange=""
swipe=""
growingStarted=""
growingFinished=""
updateStarted=""
updateFinished=""
itemPress="console.log('clicked on item')"
>
<columns>
<!-- sap.m.Column -->
</columns>
<items>
<!-- sap.m.ListItemBase -->
</items>
</Table>
我使用控制器的onInit
将行插入表中,但是当我单击某行时,该消息不会显示。
如果我在控制器中使用console.log(tablePippo.getProperty("itemPress"));
,它会抛出
未捕获错误:元素sap.m.Table中没有属性“itemPress”#toteDetail - myTable
答案 0 :(得分:44)
这似乎是人们在使用sap.m.ListBase
相关控件时经常遇到的问题。让我概述一下如何管理事件(特别是激活它们):
这种混淆可能与sap.m.ListMode
从sap.m.ListBase
继承的控件sap.m.ListType
以及从sap.m.ListItemBase
继承的<List
selectionChange=".onSelectionChange"
itemPress=".onItemPress"
delete=".onDelete"
>
<items>
<ObjectListItem
title="Hello ListItem"
press=".onObjectListItemPress"
/>
</items>
</List>
项有关。
让我们假设以下示例列表:
sap.m.List
如果您正在使用sap.m.Table
或mode
,则事件触发取决于您使用的mode
。遗憾的是,没有<List
mode="SingleSelect"
...
>
属性的列表/表格不会触发任何事件!如果希望List / Table触发这些事件,则必须为其分配一个模式。例如:
mode
这些是sap.m.ListMode
documentation:
由于没有分配mode="SingleSelect"
属性,不会触发任何事件!
onSelectionChange
的列表控件在每个项目的右侧显示一个单选按钮,并在用户单击给定的单选按钮控件时立即触发"SingleSelectLeft"
事件。使用mode="SingleSelectMaster"
只需将单选按钮移动到项目的左侧。
使用onSelectionChange
的列表控件会向您显示鼠标悬停,并在点击某个项目时触发mode="MultiSelect"
。
onSelectionChange
中的列表控件提供了一个复选框,并在每次检查和取消选中项目时触发mode="Delete"
事件。
使用onDelete
中的列表为您提供了一个不错的删除按钮并触发type
。
您应该查看另外一个属性:商品的sap.m.ListItemBase
属性。
每个项目都继承自type
,因此具有名为<items>
<ObjectListItem
type="Active"
press=".onObjectListItemPress"
detailPress=".onDetailPress"
...
/>
</items>
的属性。让我们看看它的样子:
mode
sap.m.ListMode
documentation中列出了这些类型:
根据itemPress
,可以触发列表项列表和 press
的{{1}}。所选项目会突出显示,以便用户可以查看所选内容。
提供了一个详细信息按钮(带有图标sap-icon://edit
),用于触发detailPress
事件。
顾名思义,这是Detail和Active类型的组合。因此,您可以在按钮单击时触发详细信息按钮detailPress
,并且项目本身会触发列表事件itemPress
。
这些项目具有类似导航的外观,并且会调用itemPress
和项目press
。
不会从项目本身调用任何项目事件。
现在让我们来看看你的问题。您应该为表格控件分配mode
或为您的项目分配type
。在那次改变之后,事件应该被解雇。
一般情况下,我会避免同时使用ListMode
和ListType
,因为可能会出现意外行为,但请自行检查。
答案 1 :(得分:2)
将 type =&#34; Active&#34; 添加到ColumnListItem
...
<items>
<ColumnListItem type="Active">
<cells>
<Text text="{Name}"/>
</cells>
</ColumnListItem>
</items>
...
杨旺:https://scn.sap.com/thread/3697995
答案 2 :(得分:0)
答案 3 :(得分:0)
使用sap.m.CustomListItem的简单解决方案
使用将ListItem的属性设置为
型=&#34;主动&#34;按=&#34; listPress&#34;
<List items="{/results}">
<items>
<CustomListItem type="Active" press="listPress">
<content>
<VBox>
<FlexBox direction="Row" justifyContent="SpaceBetween" alignItems="Start">
<items>
<Text text="{PernrName}" />
<Text textDirection="RTL" text="{Document Status}" class='subtext'/>
</items>
</FlexBox>
<FlexBox direction="Row" justifyContent="SpaceBetween" alignItems="End">
<items>
<Text text="{Date}" class='subtext'/>
<Text textDirection="RTL" text="{Current Processor}" class='subtext'/>
</items>
</FlexBox>
</VBox>
</content>
</CustomListItem>
答案 4 :(得分:0)
OP代码中的另一个问题是itemPress用于Table的级别而不是ListItemBase的级别。这确实会触发click事件(如果为ListItemBase元素设置了type="Active"
,如此处的其他答案中所述)。但是:事件的上下文不允许导出列表中单击的行!所以你得到一个活动,但你无法分辨它来自哪个项目。
以下是需要更改以识别OP示例中单击的行的内容,使用ColumnListItem作为ListItemBase的示例:
而不是......
<Table
...
itemPress="onItemPressed"
>
<items>
<!-- sap.m.ListItemBase -->
</items>
<columns>
<!-- sap.m.Column -->
</columns>
</Table>
...使用此:
<Table
...
>
<items>
<ColumnListItem
type="Active"
press="onItemPressed"
>
...
</ColumnListItem>
</items>
<columns>
<!-- sap.m.Column -->
</columns>
</Table>
要派生单击行的模型路径,您现在可以使用以下代码:
onItemPressed: function (oEvt) {
var sModelPath = oEvt.getSource().getBindingContext('myModelName').getPath();
var sDiD = this.getView().getModel("myModelName").getProperty(sModelPath + "/myModelFieldName");
}
您还可以在CustomListItem中添加一个customData节点,该节点包含行特定信息,并通过以下方式访问事件处理程序中的键值对:
var aCustomData = oEvt.getSource().getCustomData();
但是又一次:
只有在ListItemBase上调用onItemPressed时,这两种方法才有效
/ ColumnListItem level!