第19步:重用对话框

组件化对话框实现与重用

说明

在这一步中,我们将扩展重用概念,并在组件级调用对话框。


在第16步中,我们创建了一个对话框片段,让它可以跨视图或整个应用程序重用。但是我们把检索对话框实例,打开和关闭它的逻辑分别放在了HelloPanel视图的控制器中。坚持这种方法需要将代码复制并粘贴到我们需要的对话框的每个视图的控制器上。这将导致我们一直在避免的不必要的代码冗余。

在这一步中,我们实现了这个问题的解决方案:我们扩展了重用概念,并在组件级调用了对话框。

预览

在这里插入图片描述

现在这个对话框以组件的方式打开

代码

你可以在演练-第19步查看和下载所有文件。

webapp/Component.js
在这里插入图片描述

sap.ui.define([
	"sap/ui/core/UIComponent",
	"sap/ui/model/json/JSONModel",
	"./controller/HelloDialog"

], function (UIComponent, JSONModel, HelloDialog) {
	"use strict";
	return UIComponent.extend("sap.ui.demo.walkthrough.Component", {
		metadata : {
			manifest : "json"
		},
		init : function () {
			// call the init function of the parent
			UIComponent.prototype.init.apply(this, arguments);
			// set data model
			var oData = {
				recipient : {
					name : "World"
				}
			};
			var oModel = new JSONModel(oData);
			this.setModel(oModel);

			// set dialog
			this._helloDialog = new HelloDialog(this.getRootControl());
		},


		exit : function() {
			this._helloDialog.destroy();
			delete this._helloDialog;
		},

		openHelloDialog : function () {
			this._helloDialog.open();
		}
	});
});

对话框实例化被重构为一个新的helper对象,该对象存储在组件的私有属性中。对于helper对象的实例化,我们必须传递视图实例给添加的对话框(请参阅下面helper对象HelloDialog.js实现中的addDependent方法调用)

我们想要将重用对话框连接到应用的根视图的生命周期中,所以我们将根视图的实例传递给构造函数。可以通过调用组件的getRootControl方法来检索它。

注意
正如manifest.json文件中的参数rootView中定义的,我们的根视图是sap.ui.demo.walkthrough.view.App。可以在运行时通过访问rootControl聚合从组件中检索根视图。

为了能够从其他控制器打开对话框,我们实现了一个重用函数openHelloDialog,它调用helper对象的open方法。通过这样做,我们还可以从应用程序编码中分离重用对话框的实现细节。

到目前为止,我们向组件添加了新的属性 _helloDialog,并为其分配了一个helloDialog对象的实例。我们希望确保在组件销毁时释放为这个helper对象分配的内存。否则,我们的应用程序可能导致内存泄漏。

为此,我们使用exit hook。SAPUI5框架在销毁组件时调用指定的exit函数。我们调用HelloDialog的销毁函数来清理helper类并结束它的生命周期。然而,实例本身仍然存在于浏览器内存中。因此,我们通过调用delete this._helloDialog 来删除对HelloDialog实例的引用,而浏览器的垃圾回收可以清理它的内存。

注意
我们不必销毁我们创建的JSONModel实例,因为我们用setModel函数将它分配给了组件。SAPUI5框架会把它和组件一起销毁。

webapp/controller/HelloDialog.js (New)

sap.ui.define([
	"sap/ui/base/ManagedObject",
	"sap/ui/core/Fragment"
], function (ManagedObject, Fragment) {
	"use strict";

	return ManagedObject.extend("sap.ui.demo.walkthrough.controller.HelloDialog", {

		constructor : function (oView) {
			this._oView = oView;
		},

		exit : function () {
			delete this._oView;
		},

		open : function () {
			var oView = this._oView;

			// create dialog lazily
			if (!this.pDialog) {
				var oFragmentController = {
					onCloseDialog : function () {
						oView.byId("helloDialog").close();
					}
				};
				// load asynchronous XML fragment
				this.pDialog = Fragment.load({
					id: oView.getId(),
					name: "sap.ui.demo.walkthrough.view.HelloDialog",
					controller: oFragmentController
				}).then(function (oDialog) {
					// connect dialog to the root view of this component (models, lifecycle)
					oView.addDependent(oDialog);
					return oDialog;
				});
			} 
			this.pDialog.then(function(oDialog) {
				oDialog.open();
			});
		}

	});

});

HelloDialog重用对象的实现扩展了一个sap.ui.base.ManagedObject对象来继承SAPUI5的一些核心功能。

我们的open方法是从HelloPanel控制器重构的,并像前面的步骤一样实例化我们的对话片段。

注意
我们不将控制器作为第三个参数传递给Fragment函数。加载一个本地helper对象oFragmentContoller,它包含了片段所需的事件处理函数onCloseDialog。

open方法现在包含了我们的对话框实例化。第一次调用open方法时,对话框被实例化。该方法的oView参数用于将当前视图连接到对话框。稍后,我们将在控制器中调用该对象的open方法。

onCloseDialog事件触发器被简单地从HelloPanel控制器移到重用对象。

我们还添加了一个exit函数,就像我们在组件中做的那样,当对象被销毁时,它将被自动调用。为了释放helper对象中所有已分配的内存,我们删除保留视图引用的属性。视图本身将被组件销毁,所以我们不需要对此进行注意。

webapp/controller/HelloPanel.controller.js
在这里插入图片描述

sap.ui.define([
	"sap/ui/core/mvc/Controller",
	"sap/m/MessageToast"
], function (Controller, MessageToast) {
	"use strict";
	return Controller.extend("sap.ui.demo.walkthrough.controller.HelloPanel", {
		onShowHello : function () {
			// read msg from i18n model
			var oBundle = this.getView().getModel("i18n").getResourceBundle();
			var sRecipient = this.getView().getModel().getProperty("/recipient/name");
			var sMsg = oBundle.getText("helloMsg", [sRecipient]);
			// show message
			MessageToast.show(sMsg);
		},
		onOpenDialog : function () {
			this.getOwnerComponent().openHelloDialog();
		}
	});
});

onOpenDialog方法现在通过调用helper方法getOwnerComponent来访问它的组件。
当调用重用对象的open方法时,我们会通过当前视图将其连接到对话框。

webapp/view/App.view.xml
在这里插入图片描述

<mvc:View
	controllerName="sap.ui.demo.walkthrough.controller.App"
	xmlns="sap.m"
	xmlns:mvc="sap.ui.core.mvc"
	displayBlock="true">
	<Shell>
		<App class="myAppDemoWT">
			<pages>
				<Page title="{i18n>homePageTitle}">
					<headerContent>
						<Button
							icon="sap-icon://hello-world"
							press=".onOpenDialog"/>
					</headerContent>

					<content>
						<mvc:XMLView viewName="sap.ui.demo.walkthrough.view.HelloPanel"/>
					</content>
				</Page>
			</pages>
		</App>
	</Shell>
</mvc:View>

我们在应用视图的头部区域添加了一个按钮来显示hello world对话框的重用。当按下按钮时,对话框将像我们之前在面板中创建的按钮一样打开。

webapp/controller/App.controller.js
在这里插入图片描述

sap.ui.define([
	"sap/ui/core/mvc/Controller"
], function (Controller) {
	"use strict";

	return Controller.extend("sap.ui.demo.walkthrough.controller.App", {

		onOpenDialog : function () {
			this.getOwnerComponent().openHelloDialog();
		}
	});

});

我们也将onOpenDialog方法添加到应用程序控制器中,这样对话框就会打开并引用当前视图。

约定
将在多个控制器中使用的所有资产放在单独的模块中。

API Reference: sap.ui.base.ManagedObject

章节

  1. 第1步:你好世界
  2. 第2步:引导
  3. 第3步:控件
  4. 第4步:XML视图
  5. 第5步:控制器
  6. 第6步:模块
  7. 第7步:JSON模型
  8. 第8步:可翻译的文本
  9. 第9步:组件配置
  10. 第10步:应用程序描述符
  11. 第11步:页面和面板
  12. 第12步:Shell控件作为容器
  13. 第13步:外边距和内边距
  14. 第14步:自定义CSS和主题颜色
  15. 第15步:嵌套视图
  16. 第16步:对话框和片段
  17. 第17步:片段回调
  18. 第18步:图标
  19. 第19步:重用对话框
  20. 第20步:聚合绑定
  21. 第21步:数据类型
  22. 第22步:表达式绑定
  23. 第23步:自定义格式器
  24. 第24步:过滤
  25. 第25步:排序和分组
  26. 第26步:远程OData服务
  27. 第27步:模拟服务器配置
  28. 第28步:使用QUnit进行单元测试
  29. 第29步:与OPA的集成测试
  30. 第30步:调试工具
  31. 第31步:路由和导航
  32. 第32步:路由与参数
  33. 第33步:路由回溯和历史
  34. 第34步:自定义控件
  35. 第35步:响应性
  36. 第36步:设备适应
  37. 第37步:内容密度
  38. 第38步:可访问性
本项目通过STM32F103C8T6单片机最小系统,连接正点原子ESP8266 WiFi模块,将模块设置为Station模式,并与电脑连接到同一个WiFi网络。随后,STM32F103C8T6单片机将数据发送到电脑所在的IP地址。 功能概述 硬件连接: STM32F103C8T6单片机与正点原子ESP8266 WiFi模块通过串口连接。 ESP8266模块通过WiFi连接到电脑所在的WiFi网络。 软件配置: 在STM32F103C8T6上配置串口通信,用于与ESP8266模块进行数据交互。 通过AT指令将ESP8266模块设置为Station模式,并连接到指定的WiFi网络。 配置STM32F103C8T6单片机,使其能够通过ESP8266模块向电脑发送数据。 数据发送: STM32F103C8T6单片机通过串口向ESP8266模块发送数据。 ESP8266模块将接收到的数据通过WiFi发送到电脑所在的IP地址。 使用说明 硬件准备: 准备STM32F103C8T6单片机最小系统板。 准备正点原子ESP8266 WiFi模块。 将STM32F103C8T6单片机与ESP8266模块通过串口连接。 软件准备: 下载并安装STM32开发环境(如Keil、STM32CubeIDE等)。 下载本项目提供的源代码,并导入到开发环境中。 配置与编译: 根据实际需求配置WiFi网络名称和密码。 配置电脑的IP地址,确保与ESP8266模块在同一网络中。 编译并下载程序到STM32F103C8T6单片机。 运行与测试: 将STM32F103C8T6单片机与ESP8266模块上电。 在电脑上打开网络调试工具(如Wireshark、网络调试助手等),监听指定端口。 观察电脑是否接收到来自STM32F103C8T6单片机发送的数据。
在电子测量技术中,示波装置扮演着观测电信号形态的关键角色。然而,市售标准示波器往往定价较高,使得资源有限的入门者或教学环境难以配备。为此,可采用基于51系列微控制器的简易示波方案进行替代。该方案虽在性能上不及专业设备,但已能满足基础教学与常规电路检测的需求。下文将系统阐述该装置的主要构成模块及其运行机制。 本装置以51系列单片机作为中央处理核心,承担信号数据的运算与管理任务。该单片机属于8位微控制器家族,在嵌入式应用领域使用广泛。其控制程序可采用C语言进行开发,得益于C语言在嵌入式编程中的高效性与适应性,它成为实现该功能的合适选择。 波形显示部分采用了由ST7565控制器驱动的128×64点阵液晶模块。ST7565是一款图形液晶驱动芯片,支持多种像素规格的显示输出;此处所指的12864即表示屏幕具有128列、64行的像素阵列。该屏幕能以图形方式实时绘制信号曲线,从而提供直观的观测界面。 在模拟至数字信号转换环节,系统集成了TLC0820型模数转换芯片。该芯片具备8位分辨率及双输入通道,最高采样速率可达每秒10万次。这样的转换速度对于捕获快速变动的信号波形具有重要意义。 实现该示波装置需综合运用嵌入式软硬件技术。开发者需掌握51单片机的指令系统与编程方法,熟悉ST7565控制器的显示驱动配置,并能对TLC0820芯片进行正确的采样编程。此外,还需设计相应的模拟前端电路,包括信号调理、放大与滤波等部分,以确保输入ADC的信号质量满足测量要求。 通过C语言编写的控制程序,可完成系统各模块的初始化、数据采集、数值处理以及图形化显示等完整流程。开发过程中需借助调试工具对代码进行验证,保证程序执行的正确性与稳定性。 应当指出,受限于51系列单片机的运算能力与资源,该自制装置的功能相对基础,例如难以实现多通道同测量、高级触发模式或高容量波形存储等复杂特性。尽管如此,对于绝大多数基础电子实验与教学演示而言,其性能已足够适用。 综上所述,结合51单片机、ST7565液晶控制器与TLC0820转换芯片,可以构建出一套成本低廉、结构清晰的简易示波系统。该装置不仅可作为电子爱好者、在校学生及教师的有益实践平台,帮助理解示波测量的基本原理,还能通过动手组装与调试过程,深化对电路分析与嵌入式系统设计的认识。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值