窗口复用是一个非常常见和重要的能力,一定要熟练再熟练。脱离IDE,脱离输入帮助,notepad里写也要能写出来才可以。这个也是面试Fiori开发的一个必问问题。理解Step19后就可以理解UI5中是如何服用组件的。
首先,想象一下,要想跨View或是跨app之间公用Fregement,它的初始化和Open方法的实现一定是在能全局访问的组件中,比如component.js
所以首先看component.js中,加入了自定义的module HelloDialog.js
然后在初始化init方法中加入复用对象的实例化,对象实例化后作为component(this)的一个私有属性(_helloDialog)存在,要初始化这个实例,需要传入一个调用此dialog的view的实例作为参数,例子中是把此dialog的生命周期同app的root view绑在一起,所以传入了root view到HelloDialog的构造函数construct中,也就是this.getRootControl()。
接下来是生命周期方法exit和调用打开这个Dialog要用的方法openHelloDialog。
再看一下新建的HelloDialog.js代码,这里extend了sap.ui.base.ManagedObject来继承SAPUI5的一些核心功能,构造函数constructor,传递oView为私有属性,生命周期方法exit删除私有属性的值,open方法构建了HelloDialog的dependent,以及回调对象,然后dialog的open。
oFregmentController作为HelloDialog的回调对象,只有一个onCloseDialog方法,对应了HelloDialog Fregment中的按钮事件。
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();
}
});
});
下面是这个Dialog的使用,只需要
this.getOwnerComponent()
来调用此APP的Component的openHelloDialog方法即可。