SAP学习笔记 - 开发22 - 前端Fiori开发 数据绑定(Jason),Data Types(数据类型)

news2025/6/7 16:41:45

上一章讲了Icons(图标),Icon Explorer。

SAP学习笔记 - 开发21 - 前端Fiori开发 Icons(图标),Icon Explorer(图标浏览器)-CSDN博客

本章继续讲SAP Fiori开发的知识。

目录

1,Aggregation Binding(聚合绑定)

1),Invoices.json

2),manifest.json

3),InvoiceList.view.xml

4),App.view.xml

5),i18n.properties

6),运行看效果

2,Data Types (数据类型)

1),InvoiceList.view.xml

2),InvoiceList.controller.js

3),运行看效果

4),总结

- currency: "JPY"

- 属性的查找方法

1),如何查找官方文档

方法1:直接访问SAPUI5 API参考

方法2:通过开发环境查找

方法3:使用SAPUI5文档结构导航

2),ObjectListItem常用属性

a),核心属性

b),状态相关属性

c),数字格式化

d),其他属性


以下是详细内容。

1,Aggregation Binding(聚合绑定)

Aggregation Binding是SAP Fiori和SAPUI5框架中数据绑定的一个重要概念,它允许开发者在UI控件与其数据模型之间建立关联,是SAP Fiori开发中实现动态、数据驱动UI的核心技术,它大大简化了列表、表格等集合型控件的开发工作。

Aggregation Binding指的是将控件中的聚合(aggregation)属性与数据模型中的集合数据进行绑定。在SAPUI5中,聚合是指可以包含多个子元素的容器属性,例如:

  • Table控件的items聚合

  • List控件的items聚合

  • Form控件的formContainers聚合

Aggregation Binding通过以下方式工作:

  1. 将UI控件的聚合属性连接到数据模型中的集合

  2. 为集合中的每个数据项创建相应的子控件

  3. 自动保持UI与数据的同步

上面这一段是Deepseek里面的解释,还挺高大上的哈,我好像也没太看懂🤦‍

下面来看看实例安慰一下心情。

1),Invoices.json

这个就是咱们这个小例子里面的数据源啦。

其实数据源基本都应该是DB,从DB取数据生成jason,然后再绑定到Fiori前端,咱一步步来。

{
    "Invoices": [
        {
            "ProductName": "Pineapple",
            "Quantity": 21,
            "ExtendedPrice": 87.2,
            "ShipperName": "Fun Inc.",
            "ShippedDate": "2015-04-01T00:00:00",
            "Status": "A"
        },
        {
            "ProductName": "Milk",
            "Quantity": 4,
            "ExtendedPrice": 10,
            "ShipperName": "ACME",
            "ShippedDate": "2015-02-18T00:00:00",
            "Status": "B"
        },
        {
            "ProductName": "Canned Beans",
            "Quantity": 3,
            "ExtendedPrice": 6.85,
            "ShipperName": "ACME",
            "ShippedDate": "2015-03-02T00:00:00",
            "Status": "B"
        },
        {
            "ProductName": "Salad",
            "Quantity": 2,
            "ExtendedPrice": 8.8,
            "ShipperName": "ACME",
            "ShippedDate": "2015-04-12T00:00:00",
            "Status": "C"
        },
        {
            "ProductName": "Bread",
            "Quantity": 1,
            "ExtendedPrice": 2.71,
            "ShipperName": "Fun Inc.",
            "ShippedDate": "2015-01-27T00:00:00",
            "Status": "A"
        }
    ]
}

- Invoices:这是json文件里数据名,可以简单理解为DB的表名,那下面就是数据行和字段

2),manifest.json

{
  "_version": "1.65.0",
  "sap.app": {
	"id": "ui5.walkthrough",
	"i18n": "i18n/i18n.properties",
	"title": "{{appTitle}}",
	"description": "{{appDescription}}",
	"type": "application",
	"applicationVersion": {
	  "version": "1.0.0"
	}
  },
  "sap.ui": {
	"technology": "UI5",
	"deviceTypes": {
		"desktop": true,
		"tablet": true,
		"phone": true
	}
  },
  "sap.ui5": {
	"dependencies": {
	  "minUI5Version": "1.108.0",
	  "libs": {
		"sap.ui.core": {},
		"sap.m": {}
	  }
	},
	"models": {
	  "i18n": {
		"type": "sap.ui.model.resource.ResourceModel",
		"settings": {
		  "bundleName": "ui5.walkthrough.i18n.i18n",
		  "supportedLocales": [""],
		  "fallbackLocale": ""
		}
	  },
      "invoice": {
        "type": "sap.ui.model.json.JSONModel",
        "uri": "Invoices.json"
      }
	},
	"rootView": {
		"viewName": "ui5.walkthrough.view.App",
		"type": "XML",
		"id": "app"
	},
	"resources": {
	  "css": [
		{
		  "uri": "css/style.css"
		}
	  ]
	}
  }
}

- "invoice": {  =》这是view里面使用的model 名称

- "type": "sap.ui.model.json.JSONModel", =》这个说的是数据源的类型

- "uri": "Invoices.json" =》这个和Type配套,指向的jason文件的路径(当前文件同路径)和名称

 "invoice": {
   "type": "sap.ui.model.json.JSONModel",
   "uri": "Invoices.json"
 }

将来等连接DB的时候,这里会改成SAP提供的API(Odata)

3),InvoiceList.view.xml

<mvc:View
   xmlns="sap.m"
   xmlns:mvc="sap.ui.core.mvc">
   <List
      headerText="{i18n>invoiceListTitle}"
      class="sapUiResponsiveMargin"
      width="auto"
      items="{invoice>/Invoices}" >
      <items>
         <ObjectListItem
            title="{invoice>Quantity} x {invoice>ProductName}"/>
      </items>
   </List>
</mvc:View>

这个视图说的是把Invoices.json里的内容给通过List展示出来

- items="{invoice>/Invoices}" >

 invoice 如前述,是manifest.json 里面说的是model 名

 > 可以理解为下级访问符

 /Invoices =》/ 是绝对路径,Invoices 是 Invoices.json文件里面的名叫 Invoices(表名)的数据

- title="{invoice>Quantity} x {invoice>ProductName}"/>

 这个是个简写,完整写法是 invoice>/Invoices>Quantity,为了简略化,把>/Invoices 给省去了

<List
   headerText="{i18n>invoiceListTitle}"
   class="sapUiResponsiveMargin"
   width="auto"
   items="{invoice>/Invoices}" > 
   <items>
      <ObjectListItem
         title="{invoice>Quantity} x {invoice>ProductName}"/>
   </items>
</List>

4),App.view.xml

<mvc:View
	controllerName="ui5.walkthrough.controller.App"
	xmlns="sap.m"
	xmlns:mvc="sap.ui.core.mvc"
	displayBlock="true">
	<Shell>
		<App class="myAppDemoWT">
			<pages>
				<Page title="{i18n>homePageTitle}">
					<content>
						<mvc:XMLView viewName="ui5.walkthrough.view.HelloPanel"/>
						<mvc:XMLView viewName="ui5.walkthrough.view.InvoiceList"/>
					</content>
				</Page>
			</pages>
		</App>
	</Shell>
</mvc:View>

- <mvc:XMLView viewName="ui5.walkthrough.view.InvoiceList"/>

  这个是嵌套视图,这样就把 InvoiceList.view.xml 视图给加进来了,还是很方便的哈

SAP学习笔记 - 开发20 - 前端Fiori开发 Nest View(嵌套视图) ,Fragment(片段)-CSDN博客

5),i18n.properties

# App Descriptor
appTitle=Hello World
appDescription=A simple walkthrough app that explains the most important concepts of OpenUI5

# Hello Panel
showHelloButtonText=Say Hello
helloMsg=Hello {0}
homePageTitle=Walkthrough
helloPanelTitle=Hello World
openDialogButtonText=Say Hello With Dialog
dialogCloseButtonText=Ok

# Invoice List
invoiceListTitle=Invoices

暂时还没有Controller,就是个数据暂时,跑一下看看

6),运行看效果

2,Data Types (数据类型)

数据类型,比较典型的是金额的话,需要对应的Currency,不然也不知道是多少钱是吧。

下面来看具体的例子。

1),InvoiceList.view.xml

<mvc:View
    controllerName="ui5.walkthrough.controller.InvoiceList"
    xmlns="sap.m"
    xmlns:core="sap.ui.core"
    xmlns:mvc="sap.ui.core.mvc">
    <List
        headerText="{i18n>invoiceListTitle}"
        class="sapUiResponsiveMargin"
        width="auto"
        items="{invoice>/Invoices}">
        <items>
            <ObjectListItem
                core:require="{
                    Currency: 'sap/ui/model/type/Currency'
                }"
                title="{invoice>Quantity} x {invoice>ProductName}"
                number="{
                    parts: [
                        'invoice>ExtendedPrice',
                        'view>/currency'
                    ],
                    type: 'Currency',
                    formatOptions: {
                        showMeasure: false
                    }
                }"
                numberUnit="{view>/currency}"/>
        </items>
    </List>
</mvc:View>

- controllerName="ui5.walkthrough.controller.InvoiceList"

  加了个Controller

- ObjectListItem: 列表中的每一项使用ObjectListItem控件显示

- core:require: 动态加载Currency类型用于数据格式化

- title: 显示数量和产品名称的组合

- number: 复杂绑定,包含:

  - parts: 绑定多个数据源(价格和货币类型)

  - type: 使用Currency类型格式化,这里的主要意义就是把小数点都保留成 2位的

  - formatOptions: 格式化选项(不显示货币符号)

- numberUnit: 显示货币单位。这个其实和 number里的Currency是一个东西,只不过这个显示的小

 <ObjectListItem
     core:require="{
         Currency: 'sap/ui/model/type/Currency'
     }"
     title="{invoice>Quantity} x {invoice>ProductName}"
     number="{
         parts: [
             'invoice>ExtendedPrice',
             'view>/currency'
         ],
         type: 'Currency',
         formatOptions: {
             showMeasure: false
         }
     }"
     numberUnit="{view>/currency}"/>

2),InvoiceList.controller.js

sap.ui.define([
	"sap/ui/core/mvc/Controller",
	"sap/ui/model/json/JSONModel"
], (Controller, JSONModel) => {
	"use strict";

	return Controller.extend("ui5.walkthrough.controller.InvoiceList", {
		onInit() {
			const oViewModel = new JSONModel({
				currency: "EUR"
			});
			this.getView().setModel(oViewModel, "view");
		}
	});
});

- this.getView().setModel(oViewModel, "view"); 

  其实就是把一个JasonModel 给set 到 View上面,名称就叫 “view"。

  有关JasonModel,可以参照下面文章。

SAP学习笔记 - 开发15 - 前端Fiori开发 Boostrap,Controls,MVC(Model,View,Controller),Modules-CSDN博客

可以看到,这个Controller的作用就是弄一个Currency(这里是EUR),因为咱们json里没有嘛

真正开发当中,这个基本都是从DB取。 

3),运行看效果

把 showCurrency: true

显示的就是这样的了,EUR 单位是不是有两个,下面那个小的就是 numberUnit显示的

就是说如果你不想显示小文字的货币单位,那你完全可以去掉 numberUnit

 

去掉 numberUnit,就显示成这样

 

4),总结

本节所说的Data Types的意思是说,Fiori 页面的格式化表示,你不需要自己写多少代码,

这些Data Types(数据类型)本身就自带格式,只要设上了,就会自带格式化。

- currency: "JPY"

  这个Currency 的意义还有一个,这个需要说一下

  就是每个币种,对保留小数位数的要求是不一样的,比如日元,没有小数;欧元,需要两位小数

它这个地方好像还没有太完善哈,如果原始数据有小数的话,JPY还是保留了 2位小数

而如果第二位小数为 0,则会被删掉

不管怎么说吧,好像跟SAP里面不太一样,不知道这个可不可以设置小数位数

那要是硬搞,能让JPY不显示小数吗?网上说也是可以的

通过属性设置:formatOptions > decimals: 0

TODO:惨,不好用

我估摸着,现在只能是 Jason数据过来的时候,就给整好,不要啥啥都靠Fiori 前端

- 属性的查找方法

  下面咱们以 ObjectListItem 为例,来研究一下查找方法。

1),如何查找官方文档
方法1:直接访问SAPUI5 API参考
  1. 访问 SAPUI5 SDK - https://sapui5.hana.ondemand.com/

  2. 在顶部搜索栏输入"ObjectListItem"

  3. 在搜索结果中选择"ObjectListItem (API)"或"ObjectListItem (Samples)"

点 Control Sample 旁边那个链接,还能有例子提供

 

方法2:通过开发环境查找
  1. 在SAP Web IDE或Business Application Studio中

  2. 将光标放在控件名称上按F1

  3. 或右键点击控件选择"API Reference"

方法3:使用SAPUI5文档结构导航
  1. 进入API Reference部分

  2. 导航至 sap.m > List Items > ObjectListItem

2),ObjectListItem常用属性

ObjectListItem是SAPUI5中用于显示复杂列表项的控件,常用属性包括:

a),核心属性
  • title - 主标题文本

  • number - 右侧显示的数字(常用于金额、数量等)

  • numberUnit - 数字的单位(如货币符号)

  • intro - 副标题/简介文本

  • icon - 左侧显示的图标

  • activeIcon - 激活状态下的图标

  • type - 列表项类型(如Active, Inactive, Detail等)

b),状态相关属性
  • highlight - 高亮状态(如Success, Error, Warning等)

  • press - 点击事件处理函数

  • selected - 是否被选中

c),数字格式化
  • numberState - 数字的状态(如Success, Error等)

  • numbernumberUnit常结合使用显示格式化的金额

d),其他属性
  • attributes - 附加属性集合(显示在标题下方)

  • firstStatus - 第一个状态指示器

  • secondStatus - 第二个状态指示器

  • markers - 标记集合

 

 

以上就是本篇的全部内容。

更多SAP顾问业务知识请点击下面目录链接或东京老树根的博客主页

https://blog.csdn.net/shi_ly/category_12216766.html

东京老树根-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程之TCP编程

基于 C/S &#xff1a;客户端&#xff08;client&#xff09;/服务器端&#xff08;server&#xff09; 1.流程 2. 函数接口 所有函数所需头文件&#xff1a; #include <sys/types.h> #include <sys/socket.h> 系统定义好了用来存储网络信息的结构体 ipv4通信使…

C++进阶--C++11(04)

文章目录 C进阶--C11&#xff08;04&#xff09;lambdalambda表达式语法捕捉列表lambda的应用lambda的原理 包装器functionbind 总结结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c…

当AI遇上防火墙:新一代智能安全解决方案全景解析

在2025年网络安全攻防升级的背景下&#xff0c;AI与防火墙的融合正重塑安全防御体系。以下三款产品通过机器学习、行为分析等技术创新&#xff0c;为企业提供智能化主动防护&#xff1a; 1. 保旺达数据安全管控平台——AI驱动的动态治理引擎‌ 智能分类分级‌&#xff1a;基于…

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以&…

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

2025年6月1日&#xff0c;去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一&#xff0c;旨在通过贡献驱动的积分体系&#xff0c;激励更广泛的社区参与&#xff0c;为用户带来现实世界资产&#xff08;RWA&am…

innovus: ecoAddRepeater改变hier层级解决办法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 星主&#xff0c;我在A/B/C/D/E/U0这个cell后面插入一个BUFF&#xff0c;生成的名字为A/B/C/BUFF1&#xff0c;少了D/E两个层级&#xff0c;不应该是生成A/B/C/…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷

我的初衷&#xff1a;我想学习AI。具体的方向是这样的&#xff1a;原本传统的平台业务去对接智能体。比如发票业务&#xff0c;发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息&#xff0c;可以通过智能体给出需要处理的…

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天

低功耗架构突破&#xff1a;STM32H750 与 SD NAND &#xff08;存储芯片&#xff09;如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…

Linux(11)——基础IO(上)

目录 一、理解文件 二、回顾C文件的接口 &#x1f4c4; C语言文件操作函数表 ​编辑&#x1f4c4; 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 &#x1f4a1;用户操作文件的底层逻辑是什么&#xff1f; &#x1f4…

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer-CSDN博客 项目之间的引用关系。 ​​ 目…

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models

Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model)&#xff1a;用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph)&#xff1a;展示特征之间的相互影响&#xff0c;能够追踪模型生成输出时所采用…

STM32标准库-TIM定时器

文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果&#xff1a; 四、定时器外部中断4.1接线图…

Kafka 如何保证顺序消费

在消息队列的应用场景中&#xff0c;保证消息的顺序消费对于一些业务至关重要&#xff0c;例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统&#xff0c;通过巧妙的设计和配置&#xff0c;能够实现消息的顺序消费。接下来&#xff0c;我…

【算法题】算法一本通

每周更新至完结&#xff0c;建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针&#xff08;滑动窗口、二分查找、链表&#xff09;树前缀树堆 优先队列&#xff08;区间/间隔问题、贪心 &#xff09;回溯图一维DP位操作数学…

Modbus转Ethernet IP赋能挤出吹塑机智能监控

在现代工业自动化领域&#xff0c;小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率&#xff0c;降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;它…

什么是终端安全管理系统(终端安全管理软件2024科普)

在当今数字化迅速发展的时代&#xff0c;企业面临着越来越多的信息安全威胁。为了应对这些挑战&#xff0c;保障公司数据的安全性和完整性&#xff0c;终端安全管理系统&#xff08;Endpoint Security Management System&#xff09;应运而生。 本文将为您深入浅出地科普2024年…

【JVM】Java类加载机制

【JVM】Java类加载机制 什么是类加载&#xff1f; 在 Java 的世界里&#xff0c;每一个类或接口在经过编译后&#xff0c;都会生成对应的 .class 字节码文件。 所谓类加载机制&#xff0c;就是 JVM 将这些 .class 文件中的二进制数据加载到内存中&#xff0c;并对其进行校验…

《C++初阶之入门基础》【C++的前世今生】

【C的前世今生】目录 前言&#xff1a;---------------起源---------------一、历史背景二、横空出世---------------发展---------------三、标准立世C98&#xff1a;首个国际标准版本C03&#xff1a;小修订版本 四、现代进化C11&#xff1a;现代C的开端C14&#xff1a;对C11的…