SAP学习笔记 - 开发17 - 前端Fiori开发 Component 配置(组件化)

article/2025/8/1 1:58:48

上一章讲了Fiori前端开发中的国际化。

SAP学习笔记 - 开发16 - 前端Fiori开发 Properties文件(国际化) ,语言切换实例,Fiori 国际化(常用语言列表,关键规则,注意事项)-CSDN博客

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

目录

1,Component配置

1),Component.js

2),App.controller.js

3),index.js

2,Component配置(组件化)的理由/优势

2-1,集中化管理应用配置

a),优势

b),对比传统方式和组件化方式

2-2,全局资源生命周期管理

a),优势

b),对比传统方式和组件化方式

2-3,支持异步内容创建(Async Loading)

a),优势

b),对比传统方式和组件化方式

2-4,标准化应用结构

a),优势

b),典型结构

2-5,路由和导航集成

a),优势

b),对比传统方式和组件化方式

2-6,更好的可测试性

a),优势

2-7,何时不应使用 Component.js?

2-8,现代最佳实践

2-9,总结:组件化的核心价值


下面是详细内容。

1,Component配置

OpenUI5 SDK - Demo Kit

1),Component.js

这个文件里面的内容,可以理解为共通内容

在Fiori App加载的时候,最先加载,然后里面的数据在其他页面里面就可以直接用

从而实现不需要在每个页面里面取共通数据,而是可以直接使用的功能。

sap.ui.define(["sap/ui/core/UIComponent","sap/ui/model/json/JSONModel","sap/ui/model/resource/ResourceModel"
], (UIComponent, JSONModel, ResourceModel) => {"use strict";return UIComponent.extend("ui5.walkthrough.Component", {metadata : {"interfaces": ["sap.ui.core.IAsyncContentCreation"],"rootView": {"viewName": "ui5.walkthrough.view.App","type": "XML","id": "app"}},init() {// call the init function of the parentUIComponent.prototype.init.apply(this, arguments);// set data modelconst oData = {recipient : {name : "World"}};const oModel = new JSONModel(oData);this.setModel(oModel);// set i18n modelconst i18nModel = new ResourceModel({bundleName: "ui5.walkthrough.i18n.i18n"});this.setModel(i18nModel, "i18n");}});
});

看该文件的位置,在webapp 目录直下,表示是全局的文件

默认就生成了这些代码,咱们替换成上面代码

- rootView里面定义了默认View,以及该默认View的类型,ID等

 "rootView": {
    "viewName": "ui5.walkthrough.view.App",
    "type": "XML",
    "id": "app"
 }

- init() { =》看这段代码是不是很熟悉,其实就是把下面这篇文章里用的init函数的内容给拿过来

这样,其他Controller.js 里面就不再需要写这种共通取数据代码,而是可以直接使用

SAP学习笔记 - 开发16 - 前端Fiori开发 Properties文件(国际化) ,语言切换实例,Fiori 国际化(常用语言列表,关键规则,注意事项)-CSDN博客

2),App.controller.js

init 中的共通内容给拿到Component.js 之后,App.controller.js 里面的内容就少了很多

这里可以直接取Model:i18n,因为Comonent.js 里面 setModel了

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast"
], (Controller, MessageToast) => {"use strict";return Controller.extend("ui5.walkthrough.controller.App", {onShowHello() {// read msg from i18n modelconst oBundle = this.getView().getModel("i18n").getResourceBundle();const sRecipient = this.getView().getModel().getProperty("/recipient/name");const sMsg = oBundle.getText("helloMsg", [sRecipient]);// show messageMessageToast.show(sMsg);}});
});

3),index.js

原来是在index.js 里用XMLView,就是写成下面这样,现在换成 ComponentContainer

XMLView.create({
    viewName: "ui5.walkthrough.view.App"
}).then((oView) => oView.placeAt("content"));

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

sap.ui.define(["sap/ui/core/ComponentContainer"
], (ComponentContainer) => {"use strict";new ComponentContainer({name: "ui5.walkthrough",settings : {id : "walkthrough"},async: true}).placeAt("content");
});

- name: "ui5.walkthrough", =》这实际上是在index.html 里指定的路径,即是Component.js 的路径

  index.html里指定的ui5.walkthrough 是哪儿呢?就是 ./ ,还记得吧,也就是 index.html 当前路径

下面总体归纳一下Component配置(组件化)的理由及其优势。

以下内容为Deepseek中查询后整理而成。

2,Component配置(组件化)的理由/优势

将代码放到 Component.js 中是 SAPUI5 组件化开发(Component-based Development) 的核心实践,这种方式相比将所有逻辑放在控制器或视图中,具有以下显著优势:


2-1,集中化管理应用配置

a),优势

  • 统一入口Component.js 是 SAPUI5 应用的根节点,所有全局配置(路由、模型、服务等)在此声明,避免分散在多个文件中。

  • 元数据集中:通过 metadata 属性定义应用结构(如默认根视图),框架会自动处理视图加载和生命周期。

  • metadata: {"rootView": {"viewName": "ui5.walkthrough.view.App", // 自动加载此视图"type": "XML"}
    }

b),对比传统方式和组件化方式

  • ❌ 传统方式:在 index.html 或控制器中硬编码视图加载逻辑。

  • ✅ 组件化:通过声明式配置,框架自动处理。


2-2,全局资源生命周期管理

a),优势

  • 模型共享:在 init 方法中创建的模型(如 JSONModel、i18n ResourceModel)会自动绑定到组件及其所有子视图,无需手动传递。

  • init() {this.setModel(new JSONModel(oData)); // 全局可用this.setModel(new ResourceModel(...), "i18n"); 
    }
  • 自动销毁:组件销毁时,框架会自动清理其创建的模型和资源,避免内存泄漏。

b),对比传统方式和组件化方式

  • ❌ 传统方式:在每个控制器中重复初始化模型,需手动管理销毁。

  • ✅ 组件化:一次初始化,全局复用。


2-3,支持异步内容创建(Async Loading)

a),优势

  • 性能优化:通过 sap.ui.core.IAsyncContentCreation 接口声明组件支持异步加载,提升应用启动速度。

  • metadata: {"interfaces": ["sap.ui.core.IAsyncContentCreation"]
    }
  • 按需加载:视图和依赖资源仅在需要时加载,减少初始负载。

b),对比传统方式和组件化方式

  • ❌ 传统方式:同步加载所有资源,阻塞渲染。

  • ✅ 组件化:非阻塞式加载。


2-4,标准化应用结构

a),优势

  • 一致性:符合 SAP Fiori 设计规范,便于团队协作和维护。

  • 工具链支持:SAP Fiori Tools 和 IDE 插件(如 VS Code 扩展)能自动识别组件化结构,提供代码补全和验证。

b),典型结构

webapp/
├── Component.js       # 应用核心配置
├── manifest.json      # 描述应用元数据(现代推荐方式)
├── controller/
├── view/
└── i18n/

2-5,路由和导航集成

a),优势

  • 集中路由配置:在组件中定义路由和目标视图,实现深层链接和书签功能。

  • metadata: {"routing": {"config": { /* 路由配置 */ },"routes": [ /* 路由规则 */ ]}
    }
  • 导航上下文:路由跳转时自动传递参数到目标视图。

b),对比传统方式和组件化方式

  • ❌ 传统方式:需手动解析 URL 参数。

  • ✅ 组件化:内置路由管理。


2-6,更好的可测试性

a),优势

  • 隔离测试:组件可以独立于宿主环境(如 Fiori Launchpad)进行单元测试。

  • 模拟数据:在测试中轻松替换组件模型。


2-7,何时不应使用 Component.js?

  • 极简单应用:仅包含一个视图且无路由需求时,可直接用 XMLView.create()

  • 嵌入式控件:作为其他应用的部件(Widget)时,可能不需要完整组件。


2-8,现代最佳实践

在 SAPUI5 最新版本中,推荐将配置进一步迁移到 manifest.json 中,实现完全声明式开发

{"sap.ui5": {"models": {"i18n": {"type": "sap.ui.model.resource.ResourceModel","settings": {"bundleName": "ui5.walkthrough.i18n.i18n"}}},"rootView": {"viewName": "ui5.walkthrough.view.App","type": "XML"}}
}

2-9,总结:组件化的核心价值

特性传统方式缺点组件化优势
配置管理分散在多处,难维护集中配置,一目了然
模型共享需手动传递模型自动注入,全局可用
生命周期容易内存泄漏自动清理资源
路由支持需自定义实现内置标准化路由
工具链支持有限完整 IDE 和调试工具支持

通过组件化设计,SAPUI5 应用能获得更好的可维护性、性能和扩展性,这是企业级 Fiori 应用的必备架构模式。

确实放到Component.js里面之后好像好处巨大哈。

咱们可能没有想这么多,SAP怎么定咱们怎么用,只是Controller.js里面代码少了确实是个好事。

现在更方便的是,都已经可以吧这个东西给放到manifest.json里面来了,这就有点儿像配置了哈。所以咱们也去理解理解上面说的这些条目的含义,给我们启发,而且也许客户就喜欢听这个呢😄

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

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

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

东京老树根-CSDN博客


http://www.hkcw.cn/article/ExbMnsQWTn.shtml

相关文章

leetcode刷题日记——二叉树的层平均值

[ 题目描述 ]: [ 思路 ]: BFS,通过层次遍历求得每层的和,然后取平均数,存入结果数组树中节点个数在1-10000之间,那么结果数组最大为10000个结果,层数最多为 2n-1>10000,可以推…

Google Android 14设备和应用通知 受限制的设置 出于安全考虑......

重要提示: 文中部分步骤仅适用于 Android 13 及更高版本。了解如何查看 Android 版本。 启用受限制的设置后,应用将能够访问敏感信息,而这可能使您的个人数据面临风险。除非您信任该应用的开发者,否则我们不建议您允许访问受限制…

【小米拥抱AI】小米开源视觉大模型—— MiMo-VL

MiMo-VL-7B模型的开发包含两个序贯训练过程:(1)四阶段预训练,涵盖投影器预热、视觉-语言对齐、通用多模态预训练及长上下文监督微调(SFT),最终生成MiMo-VL-7B-SFT模型;(2…

自编码器Auto-encoder(李宏毅)

目录 编码器的概念: 为什么需要编码器? 编码器什么原理? 去噪自编码器: 自编码器的应用: 特征解耦 离散隐表征 编码器的概念: 重构:输入一张图片,通过编码器转化成向量,要求再…

Claude 4 升级:从问答助手到任务执行者 | AI大咖说

Claude 4 升级:从问答助手到任务执行者 Claude 4 升级历程 2025-05-22日,Anthropic 正式发布了他们的新 AI 模型 Claude 4。这标志着 AI 不再仅仅是一个智能问答系统,而是开始具备独立完成复杂任务的能力。CEO Dario Amodei 在发布会中强调…

Day42 Python打卡训练营

知识点回顾 1.回调函数 2.lambda函数 3.hook函数的模块钩子和张量钩子 4.Grad-CAM的示例 作业:理解下今天的代码即可 1.回调函数 Hook本质是回调函数,所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数,其目的是在某个特…

2002-2022年 城市市政公用设施水平、环境、绿地等数据-社科经管实证数据

2002-2022年城市市政公用设施水平、环境、绿地等数据-社科经管https://download.csdn.net/download/paofuluolijiang/90880456 https://download.csdn.net/download/paofuluolijiang/90880456 《2002-2022年城市市政公用设水平、环境、绿地等数据-社科经管实证数据》整理自多源…

uni-app学习笔记十七-css和scss的使用

SCSS 和 CSS的异同点 我们可以使用css和scss来设置样式。其中SCSS(Sassy CSS)是 CSS 预处理器 Sass(Syntactically Awesome Stylesheets)的一种语法格式,而 CSS(Cascading Style Sheets)是标准…

达梦分布式集群DPC_分布式事务理解_yxy

达梦分布式集群DPC_分布式事务理解 1 分布式事务是什么?2 分布式事务怎么实现?2.1 两阶段提交保障一致性2.1.1 预提交2.1.2 提交 2.2 RAFT协议保障数据强一致2.3 全局事务管理2.3.1 全局事务信息的登记流程2.3.2 数据可见性判断规则 1 分布式事务是什么&…

性能优化 - 案例篇:缓冲区

文章目录 Pre1. 引言2. 缓冲概念与类比3. Java I/O 中的缓冲实现3.1 FileReader vs BufferedReader:装饰者模式设计3.2 BufferedInputStream 源码剖析3.2.1 缓冲区大小的权衡与默认值 4. 异步日志中的缓冲:Logback 异步日志原理与配置要点4.1 Logback 异…

【目标检测】检测网络中neck的核心作用

1. neck最主要的作用就是特征融合,融合就是将具有不同大小感受野的特征图进行了耦合,从而增强了特征图的表达能力。 2. neck决定了head的数量,进而潜在决定了不同尺度样本如何分配到不同的head,这一点可以看做是将整个网络的多尺…

基于机器学习的心脏病预测模型构建与可解释性分析

一、引言 心脏病是威胁人类健康的重要疾病之一,早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集,通过机器学习算法构建预测模型,并使用 SHAP 值进行模型可解释性分析,旨在为心脏病的辅助诊断提供参考。 二、…

每日算法-250601

每日算法 - 250601 记录今天完成的算法题目。 1. 1749. 任意子数组和的绝对值的最大值 题目描述 思路 前缀和 解题过程 子数组的和 sum(nums[i..j]) 可以通过前缀和 prefixSum[j] - prefixSum[i-1] 来计算(规定 prefixSum[-1] 0)。 我们要求的是 ab…

算法打开13天

41.前 K 个高频元素 (力扣347题) 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …

【Centos7】最小化安装版本安装docker(无wget命令避坑)

文章目录 Centos7安卓docker1. 检查CentOS内核版本2. 一键将CentOs的yum源更换为国内阿里yum源3. 使用root权限登录CentOS。确保yum包更新到最新4.安装docker5.Docker阿里云镜像加速器 Centos7安卓docker 1. 检查CentOS内核版本 Docker要求CentOS系统的内核版本高于3.10&…

Vue-1-前端框架Vue基础入门之一

文章目录 1 Vue简介1.1 Vue的特性1.2 Vue的版本 2 Vue的基础应用2.1 Vue3的下载2.2 Vue3的新语法2.3 vue-devtools调试工具 3 Vue的指令3.1 内容渲染指令{{}}3.2 属性绑定指令v-bind3.3 事件绑定指令v-on3.4 双向绑定指令v-model3.5 条件渲染指令v-if3.6 列表渲染指令v-for 4 参…

Lighttpd CGI配置:404错误排查实录

目录 引言 编写测试程序 前端代码 后端代码 配置CGI模块(mod_cgi) 如何检查404错误 测试结果 ​编辑 结语 引言 在前面的测试中,我们将lighttpd移植到x210开发板中,今天学生报告说她在进行CGI程序测试时总是遭遇404错误…

卢昌海 | 质量的起源

注:本文为卢昌海 | 质量的起源五篇合辑。 公式巨多,未一一校排。 如有内容异常,请看原文。 卢昌海 | 质量的起源 (一) 一、引言 物理学是一门试图在最基本层次上理解自然的古老科学,其早期曾是哲学的一部…

5、设置时区、链接wifi

一、修改时区: 输入以下命名打开raspbian系统的设置界面 sudo raspi-config 如下图,通过键盘上下键,移动到第 5 步“localisation Options”,回车进入。 注:每个系统版本不一样,选择就不一样,我的是在第…

81、使用DTU控制水下灯光控制

基本思想:记录调试济南有人DTU控制水下灯光控制 一、首先连接dtu设备,进行供电模块的链接和RS-485控制水下探照灯 线头链接方方式示意图,供电线接入之后,要保证设备处于工作状态,如果设备在供电不处于工作状态,那可能火线和零线接反了,请重新接入; 将红色的线接入RS-4…