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

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

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

Preview

The dialog is now opened by the component (no visual changes to last step)

Coding

You can view and download all files at Walkthrough - Step 19.

webapp/Component.js

sap.ui.define([

        "sap/ui/core/UIComponent",

        "sap/ui/model/json/JSONModel",

        "sap/ui/demo/walkthrough/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对象,该对象存储在组件的私有属性中。对于助手对象的实例化,我们必须传递添加对话框的视图实例(请参阅下面的帮助对象HelloDialo.JS实现中调用addDependent的方法)。

我们希望将重用对话框连接到应用程序根视图的生命周期,因此我们将根视图的一个实例传递给构造函数。它可以通过调用组件的getRootControl方法来检索。

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

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

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

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

请注意:我们不需要销毁我们创建的JSONModel实例,因为我们使用setModel函数将它分配给了组件。SAPUI5框架将与组件一起摧毁它。

webapp/controller/HelloDialog.js (New)

sap.ui.define([

        "sap/ui/base/ManagedObject"

], function (ManagedObject) {

        "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;

                       var oDialog = oView.byId("helloDialog");

                       // create dialog lazily

                       if (!oDialog) {

                               var oFragmentController = {

                                      onCloseDialog : function () {

                                              oDialog.close();

                                      }

                               };

                               // create dialog via fragment factory

                               oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.walkthrough.view.HelloDialog", oFragmentController);

                               // connect dialog to the root view of this component (models, lifecycle)

                               oView.addDependent(oDialog);

                       }

                       oDialog.open();

               }

        });

});

我们的open方法是从HelloPanel控制器中重构出来的,并按照前面的步骤实例化我们的对话片段。HelloDialog重用对象的实现扩展了sap.ui.base。ManagedObject对象继承了SAPUI5的一些核心功能。

请注意:我们不会将控制器作为第三个参数传递给函数sa .ui。而是一个本地帮助对象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方法现在通过调用助手方法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">

        <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>

</mvc:View>

我们将一个按钮添加到app视图的标题区域,以显示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添加到app控制器中,这样对话框将在引用当前视图的情况下打开.

Conventions

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

Parent topic: Walkthrough

Previous: Step 18: Icons

Next: Step 20: Aggregation Binding

Related Information

Memory Management on https://developer.mozilla.org

API Reference:sap.ui.base.ManagedObject

UI5-文档-4.19-Reuse Dialogs的更多相关文章

  1. Spring Boot文档

    本文来自于springboot官方文档 地址:https://docs.spring.io/spring-boot/docs/current/reference/html/ Spring Boot参考 ...

  2. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  3. Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. 严重: 文档无效: 找不到语法。 at (null:2:19)

    1.错误描写叙述 严重: 文档无效: 找不到语法. at (null:2:19) org.xml.sax.SAXParseException; systemId: file:/D:/MyEclipse ...

  5. C# 语言规范_版本5.0 (第19章 附录A_文档注释)

    A. 文档注释 C# 提供一种机制,使程序员可以使用含有 XML 文本的特殊注释语法为他们的代码编写文档.在源代码文件中,可以使用特定形式的注释来指导工具从这些注释及其后的源代码元素生成 XML.使用 ...

  6. 第8.19节 使用__doc__访问Python文档字符串(DocStrings )

    __doc__特殊变量用于查看类.函数.模块的帮助信息,这些帮助信息存放在文档字符串中. 一. 关于文档字符串 关于文档字符串前面很多章节提到过,DocStrings 文档字符串用于程序的文档说明,并 ...

  7. LTE 测试文档(翻译)

    Testing Documentation 翻译 (如有不当的地方,欢迎指正!)     1 概述   为了测试和验证 ns-3 LTE 模块,文档提供了几个 test suites (集成在 ns- ...

  8. HTML文档头部

    前面的话   在声明文档类型之后,HTML文档的下一部分为<html>标签,告知浏览器应将括在<html>...</html>内的所有内容解析为HTML.然后是HT ...

  9. SpingMVC 核心技术帮助文档

    声明:本篇文档主要是用于参考帮助文档,没有实例,但几乎包含了SpringMVC 4.2版本的所有核心技术,当前最新版本是4.3,4.2的版本已经经是很新的了,所以非常值得大家一读,对于读完这篇文档感觉 ...

  10. KOTLIN开发语言文档(官方文档) -- 入门

    网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源 ...

随机推荐

  1. hdu - 1823 - Luck and Love(线段树)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/SCNU_Jiechao/article/details/24406391 题意:Wiskey招女友, ...

  2. 使用 Python 连接到 PADS Layout

    使用 Python 连接到 PADS Layout PADS Layout 使用的是 VBA 编程,很多人说 VBA 很简单,但是实在学不会,可能是太笨了. 后来发现 PADS Layout 有 CO ...

  3. FP-growth算法发现频繁项集(一)——构建FP树

    常见的挖掘频繁项集算法有两类,一类是Apriori算法,另一类是FP-growth.Apriori通过不断的构造候选集.筛选候选集挖掘出频繁项集,需要多次扫描原始数据,当原始数据较大时,磁盘I/O次数 ...

  4. tomcat源码阅读之单点登录

    一.SSO概念: 单点登录,Single Sign-On,简写为 SSO,是一个用户认证的过程,允许用户一次性进行认证后,就可访问系统中不同的应用:而无需要访问每个应用时,都重新输入用户和密码. 实现 ...

  5. 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型 ...

  6. <script>标签里的defer和async属性 区别(待补充)

    defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...

  7. tyvj1391走廊泼水节

    题目:http://www.joyoi.cn/problem/tyvj-1391 考虑对于每一条边,新加的长度是(左边点数*右边点数-1)*(当前边权+1): 然后要kruskal的思想,把边从小到大 ...

  8. C# 中取绝对值的函数

    System.Math.Abs(float value); System.Math.Abs(decimal value); System.Math.Abs(int value); System.Mat ...

  9. oracle schema 白话文详解

    概述: (一)什么Oracle叫用户(user): A user is a name defined in the database that can connect to and access ob ...

  10. bzoj3326: [Scoi2013]数数

    Description Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩. 他数数玩的具体规则是: 1. 确定数数的进制B 2. 确定一个数数的区间[L, R] 3. 对于[L, R] 间 ...