【问题标题】:How to get all values from table如何从表中获取所有值
【发布时间】:2015-09-04 18:16:46
【问题描述】:

我尝试创建简单的 SAP FIORI 应用程序,但在从详细视图中显示的表中检索数据时遇到问题。

我使用 SAP 最佳实践模板(包括路由等)+ XML 视图创建了 Master-Master-Detail 应用程序。

Detail.view.xml中的表定义:

<Table id="Chars" inset="false" items="{CharSet}">
  <columns> ... </columns>
  <items>
    <ColumnListItem>
      <cells>
        <ObjectIdentifier text="{CharNo}"/>
        <SegmentedButton selectedButton="none" visible="{isBool}">
          <Button icon="sap-icon://accept" id="sbOK" text="OK"/>
          <Button icon="sap-icon://sys-cancel" id="sbNOK" text="Not OK"/>
        </SegmentedButton>
      </cells>
    </ColumnListItem>
  </items>
</table>

我试图在Detail.controller.js 中的onSubmit 函数中获取显示的数据和选定的按钮,但是我尝试的每个代码语法都出现如下错误:

Uncaught TypeError: oTable.getContextByIndex is not a function

唯一有效的是函数,它返回表的行数:

var rowCount = this.getView().byId("Chars").getBinding("items").getLength();

如何从表格的所有行中获取选定的按钮?

【问题讨论】:

    标签: javascript sapui5 sap-fiori


    【解决方案1】:

    onSubmit 处理程序中获取此信息的快速方法如下所示:

    var items = this.getView().byId("Chars").getItems();
    items.forEach(function(item){
        // log to the console for debugging only:        
        console.log(item.getCells()[1].getSelectedButton());
    });
    

    稍微复杂一点的方法是将用户交互反映到您的模型中。这使您的模型知道所选按钮(即状态),因此始终是最新的。为此,您只需监听 SegmentedButton 的 select 事件并相应地更新模型中的值:

    /** listener for select event of SegmentedButton */
    onSelect : function(oEvent) {
        var sId = oEvent.getParameter("id"),
            oButton = oEvent.getParameter("button"),
            oBindingContext = oButton.getBindingContext(),
            sNewStatus = sId.startsWith("sbOK") ? "OK" : "NOT OK";
    
        // update model
        oBindingContext.getModel().setProperty("status", sNewStatus, oBindingContext);
    }
    

    【讨论】:

    • 不幸的是items.forEach 产生错误:Uncaught TypeError: items.forEach is not a function
    • @plota 答案的第一行有一个小错误。我刚刚更新了它。请重试。
    • 谢谢,这正是我需要的,但是数据缓存还是有问题。加载详细视图时,所有状态都正常进行,但是当我加载另一个详细视图并且不按下任何按钮时,上面的代码会返回以前的值。我何时何地可以清理这个?
    • @plota 您可以尝试在onBeforeShow 或 routeMatched 处理程序中执行此操作(如果您使用的是路由器)。看到这个Q/A
    • 我通过比较 ID 解决了这个问题,但非常感谢。我还有另一个问题,但如有必要,我会创建新主题。非常感谢蒂姆。
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2014-01-14
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多