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

article/2025/6/8 5:57:20

上一章讲了Page和Panel,Shell Control(信箱效果),Margin / Padding,自定义CSS。

SAP学习笔记 - 开发19 - 前端Fiori开发 Page和Panel,Shell Control(信箱效果),Margin / Padding,自定义CSS-CSDN博客

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

目录

1,Nest View(嵌套视图) 

1),App.view.xml

2),HelloPanel.view.xml

3),HelloPanel.controller.js

4),App.controller.js  

5),运行看效果

2,Dialog 和 Fragments

1),Fragment.view.xml

2),HelloPanel.view.xml 

3),HelloPanel.controller.js

4),运行看效果

3,指定Fragment按钮事件

1), HelloPanel.controller.js

2),HelloFragment.view.xml

3),i18n.properties

4),运行看效果


下面是详细内容。

1,Nest View(嵌套视图) 

OpenUI5 SDK - Demo Kit

嵌套视图的用途是分割视图的一部分到单独的视图文件里去,

然后把该视图里面的Controller也分割走。

其实就是一个文件里内容太多了不好管理,所以分割成多个文件进行管理这个事儿。

1),App.view.xml

<mvc:ViewcontrollerName="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"/></content></Page></pages></App></Shell>
</mvc:View>

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

  这句代码的意思就是指向Nest View(嵌套视图) (这里就是 HelloPanel)

2),HelloPanel.view.xml

<mvc:ViewcontrollerName="ui5.walkthrough.controller.HelloPanel"xmlns="sap.m"xmlns:mvc="sap.ui.core.mvc"><PanelheaderText="{i18n>helloPanelTitle}"class="sapUiResponsiveMargin"width="auto"><content><Buttontext="{i18n>showHelloButtonText}"press=".onShowHello"class="myCustomButton"/><Inputvalue="{/recipient/name}"valueLiveUpdate="true"width="60%"/><FormattedTexthtmlText="Hello {/recipient/name}"class="sapUiSmallMargin sapThemeHighlight-asColor myCustomText"/></content></Panel>
</mvc:View>

可以看到这部分就是上一章里面的App.view.xml 里面切出来的部分

SAP学习笔记 - 开发19 - 前端Fiori开发 Page和Panel,Shell Control(信箱效果),Margin / Padding,自定义CSS-CSDN博客

3),HelloPanel.controller.js

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast"
], (Controller, MessageToast) => {"use strict";return Controller.extend("ui5.walkthrough.controller.HelloPanel", {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);}});
});

这部分代码也是从App.controller.js 里切出来的

4),App.controller.js  

sap.ui.define(["sap/ui/core/mvc/Controller"
], (Controller) => {"use strict";return Controller.extend("ui5.walkthrough.controller.App", {});
});

切走一部分之后,现在App.controller.js 里面的内容就少一些了

5),运行看效果

和之前的效果是一样的,只是内部代码结构变了。

现在还只是切出来一个Nest View,其实你想,一个项目里面那么多程序,你不分开管理太困难了

2,Dialog 和 Fragments

OpenUI5 SDK - Demo Kit

上面的Nest View目的是切割一部分内容到一个单独的View里面。

其实不仅是View可以切割,还可以切割一部分功能出来,在其他地方复用,这个就叫Fragment。

Fragments 可以认为是轻量级的UI部件,或者简单叫片段也可以。

1),Fragment.view.xml

<core:FragmentDefinitionxmlns="sap.m"xmlns:core="sap.ui.core"><Dialogid="helloDialog"title="Hello {/recipient/name}"/>
</core:FragmentDefinition>

这个Fragment本身也是一个view,所以也放在view文件夹下面

看下面的代码,也没个Event,所以暂时该Fragment就是个花瓶,只显示,不能干活

2),HelloPanel.view.xml 

<mvc:ViewcontrollerName="ui5.walkthrough.controller.HelloPanel"xmlns="sap.m"xmlns:mvc="sap.ui.core.mvc"><PanelheaderText="{i18n>helloPanelTitle}"class="sapUiResponsiveMargin"width="auto" ><content><Buttonid="helloDialogButton"text="{i18n>openDialogButtonText}"press=".onOpenDialog"class="sapUiSmallMarginEnd"/><Buttontext="{i18n>showHelloButtonText}"press=".onShowHello"class="myCustomButton"/><Inputvalue="{/recipient/name}"valueLiveUpdate="true"width="60%"/><FormattedTexthtmlText="Hello {/recipient/name}"class="sapUiSmallMargin sapThemeHighlight-asColor myCustomText"/></content></Panel>
</mvc:View>

在HelloPanel 里面打算用一下。

这里加个按钮,点击之后调用 本Controller里面的onOpenDialog方法

3),HelloPanel.controller.js

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast"
], (Controller, MessageToast) => {"use strict";return Controller.extend("ui5.walkthrough.controller.HelloPanel", {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);},async onOpenDialog() {// create dialog lazilythis.oDialog ??= await this.loadFragment({name: "ui5.walkthrough.view.HelloDialog"});this.oDialog.open();}});
});

来看这段代码:

async onOpenDialog() {
   // create dialog lazily
   this.oDialog ??= await this.loadFragment({
         name: "ui5.walkthrough.view.HelloDialog"
   });

   this.oDialog.open();
}

a),async onOpenDialog()

         表示是异步方法,用于处理打开对话框。async 关键字表示该方法内部可以使用 await。

b),

this.oDialog ??= await this.loadFragment({
      name: "ui5.walkthrough.view.HelloDialog"
});

这个 this.oDialog ??= ... 是 JavaScript 的逻辑空值赋值运算符,意思是:

- 如果 this.oDialog 已经存在(不是 null 或 undefined),则不做任何操作

- 如果 this.oDialog 不存在,则执行赋值操作

-  await this.loadFragment() 异步加载一个 XML 片段

-  loadFragment 是 UI5 提供的方法,用于动态加载视图片段

-  name: "ui5.walkthrough.view.HelloDialog" 指定要加载的片段路径

- await 会等待片段加载完成后再继续执行

 

这段代码实现了:

    延迟加载:对话框只在第一次需要时加载(懒加载模式),提高初始加载性能

    单例模式:使用 ??= 确保对话框只创建一次,后续调用会复用已创建的对话框实例

    异步处理:使用 async/await 处理异步加载操作,使代码更清晰

这种模式在 Fiori 开发中很常见,特别是对于不总是显示的弹出内容,可以优化应用性能。

4),运行看效果

这个框框就是咱们切出来的HelloDialog Fragment

你可以按Esc键关掉它

上面弹出来Fragment之后就关不掉了,或者得按Esc键

那么能给这个Fragment加个按钮吗?点一下按钮就把它给关了。当然是可以的 

3,指定Fragment按钮事件

OpenUI5 SDK - Demo Kit

由于Fragment是没有自己的Controller的,它的按钮事件要写在哪里呢?答案就是在上级那里。

1), HelloPanel.controller.js

sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast"
], (Controller, MessageToast) => {"use strict";return Controller.extend("ui5.walkthrough.controller.HelloPanel", {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);},async onOpenDialog() {// create dialog lazilythis.oDialog ??= await this.loadFragment({name: "ui5.walkthrough.view.HelloDialog"});this.oDialog.open();},onCloseDialog() {// note: We don't need to chain to the pDialog promise, since this event handler// is only called from within the loaded dialog itself.this.byId("helloDialog").close();}});
});

- this.byId("helloDialog").close();

  先要找到给Fragment,然后调用 close 方法就可以关掉了

2),HelloFragment.view.xml

在Fragment上面加个按钮,再加个press事件处理代码

<core:FragmentDefinitionxmlns="sap.m"xmlns:core="sap.ui.core"><Dialogid="helloDialog"title ="Hello {/recipient/name}"><beginButton><Buttontext="{i18n>dialogCloseButtonText}"press=".onCloseDialog"/></beginButton></Dialog>
</core:FragmentDefinition>

-<beginButton>

  这里是说如果有多个按钮,这个按钮是起头的;所以还有endButton

-press=".onCloseDialog"/>

  「.」指的是当前view对应的Controller。在Fragment里,默认指的是上级Controller

  当然你要想指定到别的地方,那也是可以的

 

3),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

 

4),运行看效果

这样就出来一个OK按钮,点了之后,就会关闭了

 

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

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

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

东京老树根-CSDN博客


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

相关文章

选择正确的电平转换解决方案

1. 简介 在目前大多数电子系统中&#xff0c;对电压电平转换的需求非常普遍。 例如&#xff0c; ASIC可能在电源电压 VCCA 下工作&#xff0c;而 I/O器件可能在电源电压VCCB下工作。 为了使这些器件间能够互相通信&#xff0c;需要如下图所示的电平转换解决方案。   电子器件…

OpenLayers:通过自动布局调整解决Overlay重叠问题

一、解决Overlay重叠问题的尝试 我在最近的开发工作中遇到了一个问题。我开发的项目需要给地图上的站点添加Tooltip提示框&#xff08;即Overlay&#xff09;&#xff0c;但是由于地图上的部分站点比较密集&#xff0c;导致Tooltip的重叠比较严重&#xff0c;部分Tooltip的内容…

7.5- Loading a pretrained LLM

Chapter 7-Fine-tuning to follow instructions 7.5- Loading a pretrained LLM 开始微调前&#xff0c;我们先加载GPT2模型&#xff0c;加载 3.55 亿参数的中型版本&#xff0c;因为 1.24 亿模型太小&#xff0c;无法通过指令微调获得定性合理的结果 ​ 加载 gpt2-medium (…

C++:内存管理

一.深入理解C/C的内存分布 以上是一张C/C 程序内存分区示意图&#xff1a; 栈区 存放内容&#xff1a;局部变量&#xff08;如函数内部定义的普通变量 int a 10; &#xff09;、函数的形式参数 。其特点是由编译器自动分配和释放&#xff0c;遵循先进后出原则&#xff0c;…

【结构型模式】装饰器模式

文章目录 装饰器模式装饰器模式当中的角色和职责装饰器模式的代码实现装饰器模式与代理模式有何不同&#xff1f;装饰器模式的优缺点适用场景 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff1a;动态地给一个对象增加一些额外的职责&#xff0c;对于…

Ubuntu 挂载新盘

1.磁盘分区 rootljz:/# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 4K 1 loop /snap/bare/5 loop1 7:1 0 104.2M 1 loop /snap/core/17200 loop2 7:2 0 73.9M 1 loop /snap/core22/1908 loop3 7:3 0 104.6M 1 loo…

Flink03-学习-套接字分词流自动写入工具

上一节中通过如下命令启动服务摸来模拟Socket流。 现在我们写一个ServerSocket来模拟让流自动写入不用手动操作。 pom.xml和上一节一致不需要修改 编写代码 同样适用Socket流 // 使用socket流创建一个从 socket 读取文本的数据流&#xff0c;以换行符 \n 作为分隔符DataStre…

2022年 国内税务年鉴PDF电子版Excel

2022年 国内税务年鉴PDF电子版Excelhttps://download.csdn.net/download/2401_84585615/89784658 https://download.csdn.net/download/2401_84585615/89784658 2022年国内税务年鉴是对中国税收政策、税制改革和税务管理实践的全面总结。这份年鉴详细记录了中国税收系统的整体状…

Gitee Wiki:以知识管理赋能 DevSecOps,推动关键领域软件自主演进

关键领域软件研发中的知识管理困境 传统文档管理模式问题显著 关键领域软件研发领域&#xff0c;传统文档管理模式问题显著&#xff1a;文档存储无系统&#xff0c;查找困难&#xff0c;降低效率&#xff1b;更新不及时&#xff0c;与实际脱节&#xff0c;误导开发&#xff1…

Hadoop 3.x 伪分布式 8088端口无法访问问题处理

【Hadoop】YARN ResourceManager 启动后 8088 端口无法访问问题排查与解决(伪分布式启动Hadoop) 在配置和启动 Hadoop YARN 模块时&#xff0c;发现虽然 ResourceManager 正常启动&#xff0c;JPS 进程中也显示无误&#xff0c;但通过浏览器访问 http://主机IP:8088 时却无法打…

【最小生成树】P2573 [SCOI2012] 滑雪

题目 洛谷&#xff1a;P2573 [SCOI2012] 滑雪 分析 题目条件要点分析&#xff1a; 这道题要求 i 能到达 j 的前提是 i 、j 之间有一条连通的边并且i 的高度比 j 高。这意味着本题给出的是一个有向图。时间胶囊可以返回到上一个景点&#xff0c;可以无限使用&#xff0c;意…

2.2.2 06年T2

Stratford的两大对立力量&#xff1a;令人讽刺的居民与令人同情的公司 - 2006年考研英语Text 2精析 本文解析2006年考研英语Text 2&#xff0c;揭示Stratford小镇居民与皇家莎士比亚剧团(RSC)的深层矛盾。 一、原文与翻译 Paragraph 1&#xff1a;对立双方的形成 L1: Stratfor…

基于人工智能算法实现的AI五子棋博弈

1. 项目概述 本项目实现了一个完整的五子棋游戏系统&#xff0c;包含游戏界面、交互逻辑和人工智能对战功能。 系统采用Python语言开发&#xff0c;使用Pygame库进行图形界面渲染&#xff0c;实现了三种游戏模式&#xff1a;人人对战、人机对战和AI对战。 AI算法基于博弈树搜…

在 Ubuntu 系统上使用 Python 的 Matplotlib 库时遇到的字体缺失问题

报错问题 findfont: Font family [SimHei] not found. Falling back to DejaVu Sans. 在现实图片时尝试显示中文字符命令行报错&#xff0c;在图片中显示方框。 最终解决方案 在尝试了各种方法之后&#xff0c;在代码中添加下图中选中行&#xff0c;问题直接解决。

webstrom中git插件勾选提交部分文件时却出现提交全部问题怎么解决

原因是我有个.husky的文件制定了执行提交的时候就是提交所有的文件 修改.husky/pre-commit文件就可以啦 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"# 获取通过 WebStorm 提交的暂存文件&#xff08;仅勾选的部分&#xff09; STAGED_FILES$(gi…

KINGCMS被入侵

现象会强制跳转到 一个异常网站,请掉截图代码. 代码中包含经过混淆处理的JavaScript&#xff0c;它使用了一种技术来隐藏其真实功能。代码中使用了eval函数来执行动态生成的代码&#xff0c;这是一种常见的技术&#xff0c;恶意脚本经常使用它来隐藏其真实目的。 这段脚本会检…

CMS32M65xx/67xx系列CoreMark跑分测试

CMS32M65xx/67xx系列CoreMark跑分测试 1、参考资料准备 1.1、STM32官方跑分链接 1.2、官网链接 官方移植文档&#xff0c;如下所示&#xff0c;点击红框处-移植文档: A new whitepaper and video explain how to port CoreMark-Pro to bare-metal 1.3、测试软件git下载链接 …

Vue.js教学第十八章:Vue 与后端交互(二):Axios 拦截器与高级应用

Vue 与后端交互(二):Axios 拦截器与高级应用 在上一篇文章中,我们学习了 Axios 的基本用法,包括如何发送不同类型的 HTTP 请求以及基本的配置选项。本文将深入剖析 Axios 的拦截器功能,探讨请求拦截器和响应拦截器的作用、配置方法和应用场景,通过实例展示如何利用拦截…

【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3

❝ KubeSphere V4已经开源半年多&#xff0c;而且v4.1.3也已经出来了&#xff0c;修复了众多bug。介于V4优秀的LuBan架构&#xff0c;核心组件非常少&#xff0c;资源占用也显著降低&#xff0c;同时带来众多功能和便利性。我们决定与时俱进&#xff0c;使用1.30版本的Kubernet…

【判断酒酒花数】2022-3-31

缘由对超长正整数的处理&#xff1f; - C语言论坛 - 编程论坛 void 判断酒酒花数(_int64 n) {//缘由https://bbs.bccn.net/thread-508634-1-1.html_int64 t n; int h 0, j 0;//while (j < 3)h t % 10, t / 10, j;//整数的个位十位百位之和是其前缀while (t > 0)h t…