如何处理sap.m.Table的itemPress?

时间:2014-06-20 12:59:47

标签: sapui5 sap-fiori

我写了一个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

5 个答案:

答案 0 :(得分:44)

这似乎是人们在使用sap.m.ListBase相关控件时经常遇到的问题。让我概述一下如何管理事件(特别是激活它们):

这种混淆可能与sap.m.ListModesap.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.ListMode (Sample)

如果您正在使用sap.m.Tablemode,则事件触发取决于您使用的mode。遗憾的是,没有<List mode="SingleSelect" ... > 属性的列表/表格会触发任何事件!如果希望List / Table触发这些事件,则必须为其分配一个模式。例如:

mode

这些是sap.m.ListMode documentation

的可能模式

无(默认)

由于没有分配mode="SingleSelect"属性,不会触发任何事件!

  

List mode None

SingleSelect | SingleSelectLeft

onSelectionChange的列表控件在每个项目的右侧显示一个单选按钮,并在用户单击给定的单选按钮控件时立即触发"SingleSelectLeft"事件。使用mode="SingleSelectMaster"只需将单选按钮移动到项目的左侧。

  

List mode SingleSelectLeft

SingleSelectMaster

使用onSelectionChange的列表控件会向您显示鼠标悬停,并在点击某个项目时触发mode="MultiSelect"

  

List mode SingleSelectMaster

多选

onSelectionChange中的列表控件提供了一个复选框,并在每次检查取消选中项目时触发mode="Delete"事件。

  

List mode MultiSelect

删除

使用onDelete中的列表为您提供了一个不错的删除按钮并触发type

  

List mode Delete


sap.m.ListType (Sample)

您应该查看另外一个属性:商品的sap.m.ListItemBase属性。

每个项目都继承自type,因此具有名为<items> <ObjectListItem type="Active" press=".onObjectListItemPress" detailPress=".onDetailPress" ... /> </items> 的属性。让我们看看它的样子:

mode

sap.m.ListMode documentation中列出了这些类型:

有效

根据itemPress,可以触发列表项列表 press的{​​{1}}。所选项目会突出显示,以便用户可以查看所选内容。

  

Item type Active

详细

提供了一个详细信息按钮(带有图标sap-icon://edit),用于触发detailPress事件。

  

Item type Detail

DetailAndActive

顾名思义,这是Detail和Active类型的组合。因此,您可以在按钮单击时触发详细信息按钮detailPress,并且项目本身会触发列表事件itemPress

  

Item type DetailAndActive

导航

这些项目具有类似导航的外观,并且会调用itemPress和项目press

  

Item type Navigation

无效

不会从项目本身调用任何项目事件。


现在让我们来看看你的问题。您应该为表格控件分配mode或为您的项目分配type。在那次改变之后,事件应该被解雇。

一般情况下,我会避免同时使用ListModeListType,因为可能会出现意外行为,但请自行检查。

答案 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)

在控制器中为XML视图定义myItemPress成员函数并将其引用为

itemPress = "myItemPress"

See example

答案 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!