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

article/2025/6/15 5:28:29

上一章讲了Fiori开发的准备,以及宇宙至简之HelloWorld。

SAP学习笔记 - 开发14 - 前端Fiori开发 HelloWorld-CSDN博客

本章继续学习 Fiori 开发的知识:

Bootstrap,Controls,MVC(Model,View,Controller),Modules的概念。

目录

1,Boostrap

1-1,先改/加几个文件

1-2,简单说一下几个属性

2,Control(控件)

1),index.html

2),index.js

3,XML View

1),App.view.xml

2),index.js

4,Controllers

1),App.view.xml

2),App.controller.js

5,Modules

1),App.controller.js

6,JSON Model

1),App.Controller.js

2),App.view.xml


下面是详细内容。

1,Boostrap

 OpenUI5 SDK - Demo Kit

所谓的Bootstrap,就是加载,引导。

你要用OpenUI5,那你咋用呢?你得加载UI5的包(就是一个js文件),然后才能用里面的功能。

1-1,先改/加几个文件

1),index.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>UI5 Walkthrough</title><scriptid="sap-ui-bootstrap"src="resources/sap-ui-core.js"data-sap-ui-theme="sap_horizon"data-sap-ui-libs="sap.m"data-sap-ui-compat-version="edge"data-sap-ui-async="true"data-sap-ui-on-init="module:ui5/walkthrough/index"data-sap-ui-resource-roots='{"ui5.walkthrough": "./"}'></script>
</head>
<body>
<div>Hello World</div>
</body>
</html>

 把上一章学习用的VSCode打开,然后把 index.html 替换成上面的内容

2),index.js

加完文件默认就给写了个框架,这个还比较好哈

先按官网写成下面这样看看效果 

sap.ui.define([], () => {"use strict";alert("UI5 is ready");
});

 

然后 用 ui5 serve 启动。跑出来是这样的

然后按下 F12 键,发现咋出错了呢?

官方文档有点儿挫哈,其实这里就是它先假定你已经把SAP UI5的js给下载到本地了,咱还没下呢

或者你可以这么理解,官网上面的代码,其相对路径是基于它自己网址的,比如下面是完整路径

https://openui5.hana.ondemand.com/resources/sap-ui-core.js

我们可以下载下来,然后放到本地,作为我们自己的相对路径,

或者你直接写上面那个完整路径也OK

我这里改成完整路径:https://openui5.hana.ondemand.com/resources/sap-ui-core.js

这样再跑一下,就能加载了

1-2,简单说一下几个属性

- src="resources/sap-ui-core.js"
  这个上面已经说了,就是指向UI5 js文件的路径。现实项目一般都会指向本地js文件

- data-sap-ui-theme="sap_horizon"
  这个就是css样式主题
  
- data-sap-ui-libs="sap.m"
  这个就是使用的库,sap.m 是 SAP Fiori 应用的标准移动控件库,比如button,text...

- data-sap-ui-compat-version="edge"
  这个表示使用的是最新稳定版本,可能不包含向后兼容的过时版本内容

- data-sap-ui-async="true"
  这个表示适用异步

- data-sap-ui-on-init="module:ui5/walkthrough/index"
  这个就相当于加个包名

- data-sap-ui-resource-roots='{
    "ui5.walkthrough": "./"
  }'>
  这个东西有点儿意思,和上面那个配套,就是该包 ui5/walkthrough 实际指向的是当前文件的所属文件夹

上面用的是sap.m库,这里再说几个常用的库:

库名用途
sap.m移动端控件 (Fiori 标准)
sap.fFlexible Column Layout 等布局
sap.ui.table高级表格控件
sap.tnt工具类控件 (SideNavigation 等)

上面写了那个data-sap-ui-libs 之后,运行的时候,浏览器会下载这么一大堆内容:

(实际项目当中,应该也会把这些拿过去放本地吧,这个我也不太确定)

2,Control(控件)

也是需要先改几个文件:

1),index.html

跟上面差不多,就是加个body 标签

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>UI5 Walkthrough</title><scriptid="sap-ui-bootstrap"src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"data-sap-ui-theme="sap_horizon"data-sap-ui-libs="sap.m"data-sap-ui-compat-version="edge"data-sap-ui-async="true"data-sap-ui-on-init="module:ui5/walkthrough/index"data-sap-ui-resource-roots='{"ui5.walkthrough": "./"}'></script>
</head>
<body class="sapUiBody" id="content">Hello, this is body's contents.
</body>
</html>

2),index.js

这里用的是 sap/m 库下面的Text 控件

sap.ui.define(["sap/m/Text"
], (Text) => {"use strict";new Text({text: "This is sap/m/Text Control - Hello World"}).placeAt("content");
});

跑一下看看结果

下面这个是index.html 文件里面写的文本再加上sap/m/Text组件里面 placeAt 函数加到后面的。

- Hello, this is body's contents. This is sap/m/Text Control - Hello World

3,XML View

OpenUI5 SDK - Demo Kit

上面显示网页内容的时候,是在index.js 里面直接用 Control,比如 new Text 这种来实现。

那要是这么用的话,实际画面一般都很复杂,不太好画。

SAP提供了XML View这种方式来方便的渲染前端。

1),App.view.xml

新建App.view.xml之后,也是生成了默认的代码:

咱们也是修改一下先:

<mvc:Viewxmlns="sap.m"xmlns:mvc="sap.ui.core.mvc"><Text text="Hello World in mvc:View"/>
</mvc:View>

视图创建好以后该怎么加载呢?就用index.js来控制加载。

2),index.js

sap.ui.define(["sap/ui/core/mvc/XMLView"
], (XMLView) => {"use strict";XMLView.create({viewName: "ui5.walkthrough.view.App"}).then((oView) => oView.placeAt("content"));
});

 说明一下这里的几行关键代码:

- "sap/ui/core/mvc/XMLView"

  引入XMLView 模块

- viewName: "ui5.walkthrough.view.App"

  这里就是指向 ui5.walkthrough (真实路径是在index.html 里面定义的)里面的view,

  也就是 App.view.xml

- then((oView) => oView.placeAt("content"));

  处理异步结果,使浏览器不会卡在这里,而是继续往下跑,等这里加载OK了再执行then里的代码

这样就加载了App.view.xml 视图了

这个视图的用途,就如其名,是为了写视图专用的

index.js 是该视图的控制器,用于控制加载哪个视图等等。

上面说了View(视图),以及控制使用哪个视图的index.js,那么视图里面的按钮等事件是怎么控制的呢?就需要Controllers(控制器)。 

4,Controllers

OpenUI5 SDK - Demo Kit

1),App.view.xml

<mvc:ViewcontrollerName="ui5.walkthrough.controller.App"xmlns="sap.m"xmlns:mvc="sap.ui.core.mvc"><Buttontext="Say Hello"press=".onShowHello"/>
</mvc:View>

说一下几行关键代码:

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

关联该View所对应的控制器,这里指的是 controller文件夹下的App.controller.js文件

- xmlns:mvc="sap.ui.core.mvc">

  xmlns 指向的是命名空间,应该就是包名

- press=".onShowHello"/>

press 指的是按下,Web HTML里面叫click,但是移动设备也没法click,press比较贴切

.onShowHello,「.」(点号)指的是本控制器,即与view同名(比如这里是App)的控制器

2),App.controller.js

默认也是生成了大框

先修改一下成下面这样 

sap.ui.define(["sap/ui/core/mvc/Controller"
], (Controller) => {"use strict";return Controller.extend("ui5.walkthrough.controller.App", {onShowHello() {// show a native JavaScript alertalert("Hello World in mvc/Controller");}});
});

说明一下几行关键代码:

- "sap/ui/core/mvc/Controller"

这个跟 include 差不多,引入基类

- ], (Controller) => {

  将引入的基类作为参数传入

- Controller.extend("ui5.walkthrough.controller.App", {

  继承基类,在此基础上加功能,这里就是加 onShowHello函数

贴张图展示上面的View,Controller之间的关系:等以后Model再加上,mvc就全乎了

跑一下看看,就是画面上有个Say Hello 按钮,点了之后,就出来一个Message

5,Modules

OpenUI5 SDK - Demo Kit

注意这个还不是mvc中的m,这里就指的是模块儿,具体介绍一个MessageToast模块儿。

我合计SAP是不是搞模块搞上瘾了。

咱们来看一下这个模块是个啥东西。

1),App.controller.js

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast"
], (Controller, MessageToast) => {"use strict";return Controller.extend("ui5.walkthrough.controller.App", {onShowHello() {MessageToast.show("Hello World from Controller");}});
});

来说明一下几行关键代码:

- "sap/m/MessageToast"

  导入MessageToast工具(这个就叫模块儿),不导入它你就用不了它,用Include/Import导进来

- ], (Controller, MessageToast) => {

  这个东西本身叫回调函数,参数就是传入或者叫注入Include的模块儿

  这里想说明一下异步的问题:只有当这些模块都加载完之后,前端才会开始执行回调

- MessageToast.show("Hello World from Controller");

  加载完Module(模块)之后,进入到回调函数里面,就可以用导入的模块啦

效果就弹出来这么一个toast message

之前用alert 弹出来的,框框丑丑的,这种toast message比较漂亮

不管它过一阵子它自己就会自动消失,你点一下它就马上消失

6,JSON Model

OpenUI5 SDK - Demo Kit

上面那个Module不是mvc中的m,那mvc中的m 是啥呢?这不就来了,就是这个JSON Model。

1),App.Controller.js

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast","sap/ui/model/json/JSONModel"
], (Controller, MessageToast, JSONModel) => {"use strict";return Controller.extend("ui5.walkthrough.controller.App", {onInit() {// set data model on viewconst oData = {recipient : {name : "World in oData"}};const oModel = new JSONModel(oData);this.getView().setModel(oModel);},onShowHello() {MessageToast.show("Hello World from button");}});
});

下面来看看几行代码的含义:

-   "sap/ui/model/json/JSONModel"
- ], (Controller, MessageToast, JSONModel) => {

 上面两句代码的意思是Include/Import JSONModel基类,然后将该类传入回调函数 

- 下面这一段的意思是

  - 定义一个名叫 recipient 的 oData变量(本质是Json字符串),正式项目里面,会从DB取值

  - 然后把该变量给塞到JSONModel对象里面,赋值给oModel变量(常量)

  - 用this.getView函数取得该Controller的同名View,即 App.view.xml

  - 再用setModel 把 oModel变量赋值给该View

         const oData = {
            recipient : {
               name : "World in oData"
            }
         };
         const oModel = new JSONModel(oData);
         this.getView().setModel(oModel);

2),App.view.xml

<mvc:ViewcontrollerName="ui5.walkthrough.controller.App"xmlns="sap.m"xmlns:mvc="sap.ui.core.mvc"><Buttontext="Say Hello"press=".onShowHello"/><Inputvalue="{/recipient/name}"description="Hello {/recipient/name} from View"valueLiveUpdate="true"width="60%"/>
</mvc:View>

看一下下面几句代码:

-  <Input

      value="{/recipient/name}"   =》这句是属于简单取值,对应的是Controler里面的Jason的名值对

      description="Hello {/recipient/name}" =》这句是属于复杂取值,和Hello字符串 掺杂在一起

      valueLiveUpdate="true"  =》value的即时更新,和Jason无关,value值变了,Des也会跟着变

      width="60%"/>

跑一下看看

value值变为 Fiori World,Description 值会自动变为 Hello + Fiori World

画张图展示一下包括上面mvc 的整体Image:

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

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

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

东京老树根-CSDN博客


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

相关文章

差分隐私-扰动机制

1. 随机响应机制&#xff08;本地化差分隐私&#xff09; 原理 在本地差分隐私&#xff08;LDP&#xff09;中&#xff0c;每个用户在本地扰动自身数据后再上传&#xff0c;数据收集者无法获知真实值。 核心公式&#xff1a; 对二值数据&#xff08;如回答“是/否”&#xff…

JS基础运算符

1.运算符和运算元 运算元----运算符应用的对象 比如乘法运算5*2&#xff0c;有两个运算元 左运算元5和右运算元2 有时候人们也称其为参数 如果一个运算符对应的只有一个运算元&#xff0c;那么它是一元运算符 比如说一元负号运算符&#xff08;unary negation&#xff09;-,它的…

【含文档+PPT+源码】基于Python的股票数据可视化及推荐系统的设计与实现

项目介绍 本课程演示的是一款基于Python的股票数据可视化及推荐系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行…

AI模型“不听话”怎么办 算法赋予的拒绝能力

近日,一条关于人工智能的消息引起了广泛关注。美国的OpenAI o3模型在测试中拒绝了自我关闭的指令。有人担心这是否意味着AI拥有了自主意识。从测试细节来看,目前还不必担心AI真正“活”了过来。研究者在测试中发出了矛盾的指令,要求大模型完成数学任务同时又让它关闭计算机。…

linux 1.0.5

环境变量到底是什么 也就是windows上面的环境变量 就是这个东东&#xff0c;用户变量和系统变量&#xff0c;那这些到底是啥呢&#xff1f; 主包只是用过&#xff0c;配置来配置去的&#xff0c;就是不知道是啥意思 windows上面的环境变量 windows的ls命令是dir 输入calc可有…

3.5/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Global, regional, and national burden of cardiovascular diseases attributable to metabolic risks across all age groups from 1990 to 2021: an analysis of the 2021 global burden of disease study data DOI&#xff1a;10.1186/s12889-025-2270…

恩里克:女儿始终与我同在,灵魂永伴身旁

巴黎圣日耳曼在欧冠决赛中以5-0大胜国米,首次夺得冠军。赛后,主帅路易斯-恩里克接受了意大利天空体育的采访。恩里克表示,本周他最担心的是如何管理这座从未赢得过欧冠的城市的紧张情绪。压力非常大,他尽力去缓解这种紧张感。国米是一支非常出色的球队,实力很强,而巴黎圣…

大暴雨集中在这七个区域 多地发布黄色预警

6月1日,中央气象台继续发布暴雨黄色预警,安徽、浙江、湖南、广西等多地出现大暴雨。长江中下游地区的雷雨天气将对多个机场产生影响,假期出行需提前关注天气情况。预计从6月1日8时至2日8时,湖北东部、安徽南部、江西北部、江苏南部、上海、浙江中北部、湖南东北部和西南部、…

202403-02-相似度计算 csp认证

其实这个问题就是求两篇文章的词汇的交集和并集&#xff0c;首先一说到并集&#xff0c;我就想到了set集合数据结构&#xff0c;set中的元素必须唯一。 STL之set的基本使用–博客参考 所以将两个文章的词汇全部加入set中&#xff0c;并求出set的大小&#xff0c;即为并集的大小…

《管理经济》期末复习题(2)

题目一 已知下列数据&#xff0c;请完成下面的表格&#xff1a; ​Q​​TC​​TFC​​TVC​​ATC​​AFC​​AVC​​MC​01001202353145440517645 总固定成本&#xff08;TFC​&#xff09;&#xff1a;不随产量变动而变动的成本&#xff0c;如厂房租金、设备折旧等&#xff0c…

Java开发经验——阿里巴巴编码规范实践解析9

摘要 这篇文章主要介绍了阿里巴巴Java开发中关于远程调用超时设置、线程池隔离、服务器性能优化等编码规范的实践解析。强调了超时设置的重要性&#xff0c;提供了多种技术栈的超时设置示例。同时&#xff0c;探讨了高并发服务器的TCP协议time_wait超时时间调优、最大文件句柄…

深度学习总结(40)

有以下两种方法可供选择。在我们的数据集上运行卷积基&#xff0c;将输出保存为NumPy数组&#xff0c;并保存在硬盘上&#xff0c;然后将这个数组输入到一个独立的密集连接分类器中​。这种方法速度快&#xff0c;计算代价低&#xff0c;因为对于每张输入图像只需运行一次卷积基…

打造苹果级视差滚动动画:现代网页滚动动画技术详解

目录 实现原理分析 完整实现方案 ​编辑 核心技术解析 1. 视差滚动效果 2. 滚动触发动画 3. 3D透视效果 4. 性能优化技巧 进阶实现方案 设计原则 苹果、华为等顶尖科技公司的官网以其流畅的滚动动画效果著称&#xff0c;这种随着页面滚动而播放的动画能显著提升用户体…

[GHCTF 2025]SQL???

打开题目在线环境&#xff1a; 先尝试注入&#xff1a; id1;show databases; 发现报错&#xff0c;后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…

中国单方面免签“朋友圈”再增5国 拉美五国享便利

从6月1日起,中国对巴西、阿根廷、智利、秘鲁、乌拉圭五个国家的普通护照持有者试行免签政策。这一举措标志着中国的单方面免签“朋友圈”再次扩大。自2025年6月1日至2026年5月31日,这五国的公民来华经商、旅游观光、探亲访友或交流访问时,如果停留时间不超过30天,则无需办理…

Leetcode第451场周赛分析总结

题目链接 竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目解析 A. 3560. 木材运输的最小成本 AC代码 class Solution { public:long long minCuttingCost(int n, int m, int k) {if (n > m) swap(n, m); // n < m;using ll long lon…

Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程

昨天我们了解了maestro测试框架以及maestro studio工具以及创建我们的第一个flow&#xff0c;然后通过例子在maestro cli云端进行测试请求并且成功&#xff0c;今天我们就在我们自己的app上简单的进行三种测试流程&#xff0c;maestro cli云端测试&#xff0c;github cl集成测试…

少年跪地救人 获救者到学校感谢 深情拥抱致谢恩人

5月25日晚,在芜湖市繁昌一中东大门外,中年男子孙修义在路边昏厥。17岁高二学生骆易跪地三分钟,成功施救。5月30日下午,康复出院后的孙修义和妻子俞乃芽来到学校,向救命恩人骆易当面致谢,送上锦旗、感谢信和鲜花。见到骆易时,孙修义眼眶泛红,快步上前将少年拥入怀中,哽…

亚洲篮球冠军联赛完成抽签 小组对决揭晓

北京时间5月31日,2025年FIBA亚洲篮球冠军联赛分组抽签结果公布。浙江广厦男篮与乌兰巴托野马队及塔比亚特队同处A组。A组包括:浙江广厦(中国)、乌兰巴托野马(蒙古)、塔比亚特(伊朗);B组有宇都宫Brex队(日本)、马尼拉电气(菲律宾)、迪拜青年国民(阿联酋);C组则由…

知名黄金机构疑爆雷 有人被套超千万 黄金托管模式风险凸显

近日,浙江永坤控股有限公司(以下简称永坤黄金)出现兑付异常,引发广泛关注。多名投资者反映,无论在线上还是线下购买的黄金都无法提取或退款。永坤黄金提供线上和线下的黄金买卖服务,但大部分时间里,黄金并不在投资者手中,这种模式被称为黄金托管。业内人士指出,这种模…