You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将OData计数值绑定到SAP UI5单个Tile属性?

问题分析与解决方案

你遇到的问题核心在于异步操作的执行时机:你的formatTile格式化函数里调用了异步的OData read方法,但格式化函数本身是同步执行的——当return counter语句执行时,read的success回调还没触发,counter仍处于未定义状态,UI5会将其解析为0显示;而MessageToast是在success回调里执行的,这时候已经拿到了正确的计数,所以能正常显示91。

正确的实现方式

格式化函数应该只负责同步格式化已有数据,异步数据请求应该放在控制器的初始化逻辑里,拿到数据后再通过数据绑定同步到UI上。我们可以通过一个本地JSON模型来存储计数值,具体步骤如下:

1. 修改视图代码

NumericContentvalue绑定到本地JSON模型的属性上:

<mvc:View controllerName="customtileapp.controller.CustomTile1" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" >
  <GenericTile class="sapUiTinyMarginBegin sapUiTinyMarginTop tileLayout" header="Country-Specific Profit Margin" subheader="Expenses" press="press" >
    <TileContent unit="EUR" footer="Current Quarter" >
      <NumericContent scale="M" value="{viewModel>/customerCount}" valueColor="Error" indicator="Up" formatterValue="true" />
    </TileContent>
  </GenericTile>
</mvc:View>

2. 修改控制器代码

引入JSONModel,创建本地模型存储计数值,在onInit里异步读取计数并更新模型:

sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "sap/m/MessageToast",
  "sap/ui/model/odata/v2/ODataModel",
  "sap/ui/model/json/JSONModel" // 新增JSONModel引入
], function (Controller, MessageToast, ODataModel, JSONModel){
  "use strict";
  return Controller.extend("customtileapp.controller.CustomTile1", {
    onInit: function() {
      this.oView = this.getView();
      // 创建本地JSON模型,用来存储计数值
      const oViewModel = new JSONModel({
        customerCount: 0 // 初始值设为0
      });
      this.oView.setModel(oViewModel, "viewModel"); // 给模型命名为viewModel
      
      this.oModel = new ODataModel("/northwind/V2/Northwind/Northwind.svc");
      this.oView.setModel(this.oModel);
      
      // 异步读取客户计数
      this.oModel.read("/Customers/$count", {
        async : true,
        success : function(oData, response) {
          const counter = response.body;
          MessageToast.show(counter);
          // 更新本地模型的计数值,UI会自动刷新
          oViewModel.setProperty("/customerCount", counter);
        },
        error: function(oError) {
          MessageToast.show("读取计数失败:" + oError.message);
        }
      });
    },
    press: function() {
      // 可保留点击事件逻辑,按需调整
      MessageToast.show("Tile被点击了");
    }
  });
});

方案说明

  • 本地JSON模型是响应式的,当调用setProperty更新值时,UI会自动刷新,显示最新的计数值。
  • 异步请求放在onInit里,页面初始化时就发起请求,拿到数据后更新模型,完美适配UI5的数据绑定机制,避免了异步操作与同步格式化的时机冲突。

内容的提问来源于stack exchange,提问作者Timur

火山引擎 最新活动