转载:https://www.nabisoft.com/tutorials/sapui5/creating-custom-controls-in-sapui5

      https://sapui5.hana.ondemand.com/#/topic/8dcab0011d274051808f959800cabf9f

1.在SAPUI5中创建自定义控件并加载显示。

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Creating Custom Controls in SAPUI5 Demo</title> <script id="sap-ui-bootstrap"
src="https://openui5.hana.ondemand.com/1.44.19/resources/sap-ui-core.js"
data-sap-ui-theme="sap_belize"
data-sap-ui-libs="sap.m"
data-sap-ui-compatVersion="edge"
data-sap-ui-preload="async"></script> <!-- XMLView (usually in a separate file) -->
<script id="myXmlView" type="ui5/xmlview">
<mvc:View
controllerName="nabisoft.my.Controller"
xmlns:mvc="sap.ui.core.mvc"
xmlns="nabisoft.bookstore.controls"> <!-- use our custom control, implementation see below -->
<!-- works w/o namespace prefix because the default is set to "nabisoft.bookstore.controls" -->
<Book
id="myBook"
height="auto"
title="My Book in XMLView"
author="My Author"
description="This is a Book about..."
price="11.99"
currencyCode="USD"
comments="Great book!,A must have!,I liked chapter 6 the most!"
numberOfPages="349"
coverPictureUrl="https://lorempixel.com/150/200/"
expressDelivery="true"
buy="onBuy" /> </mvc:View>
</script> <script>
sap.ui.getCore().attachInit(function () {
"use strict"; //### custom currency datatype (usually in a separate file) ###
/**
* A string type that represents currency codes that are currently supported
* by our little application. Currently only "USD" and "EUR" is supported
*/
sap.ui.define("nabisoft/bookstore/datatypes/CurrencyCode",[
"sap/ui/base/DataType"
], function(DataType) {
"use strict"; return DataType.createType(
"nabisoft.bookstore.datatypes.CurrencyCode",
{
isValid : function(sValue) {
return sValue === "EUR" || sValue === "USD";
},
},
DataType.getType("string")
);
}, true); //### Custom Control (usually in separate files) ###
sap.ui.define("nabisoft/bookstore/controls/Book",[ // remove the first parameter in "real" apps
"sap/ui/core/Control",
"sap/m/Button",
"sap/m/Image",
"sap/m/Link",
"sap/m/Text"
], function(Control, Button, Image, Link, Text) {
"use strict"; var Book = Control.extend("nabisoft.bookstore.controls.Book", {
// the control API:
metadata : {
properties : {
/* Business Object properties */
title : {type : "string"},
author : {type : "string"},
description : {type : "string"},
price : {type : "float"},
currencyCode : {type : "nabisoft.bookstore.datatypes.CurrencyCode", defaultValue : "USD"}, //BUG defaultValue is not validated
comments : {type : "string[]", defaultValue: []},
numberOfPages : {type : "int"},
coverPictureUrl : {type : "string"}, // usueally you would use "sap.ui.core.URI" for type
expressDelivery : {type : "boolean", defaultValue : false}, /* other (configuration) properties */
width : {type : "sap.ui.core.CSSSize", defaultValue : "400px"},
height : {type : "sap.ui.core.CSSSize", defaultValue : "400px"}, // only for demonstration
someObject : {type : "object"},
whatever : {type : "any"}
}, aggregations : {
_buyButton : {type : "sap.m.Button", multiple : false, visibility: "hidden"},
coverPicture : {type : "sap.m.Image", multiple : false, visibility: "public"}
}, associations: {
relatedBooks : {type : "nabisoft.bookstore.controls.Book", multiple : true, singularName: "relatedBook"}
}, events : {
buy : {enablePreventDefault : true}
}
}, // be careful with this, better avoid it!
// See why at https://www.nabisoft.com/tutorials/sapui5/why-initializing-properties-on-prototypes-can-have-nasty-side-effects-in-sapui5
//_oLink : null, init : function(){
var oControl = this, oBuyBtn, oCoverPic; this._oLink = new Link();
//do something with the link
//... //create a button for buying that book
oBuyBtn = new Button({
text: "Buy this book",
press: function (oEvent) {
oControl.fireBuy({
someData : "some data I want to pass along with the event object"
});
}
});
this.setAggregation("_buyButton", oBuyBtn); //create and initialize the cover picture, but we don't have a src yet
oCoverPic = new Image({
decorative: true,
width: "150px",
height: "200px",
tooltip: "Cover of book"
});
oCoverPic.addStyleClass("nsBookCvrPic");
this.setCoverPicture(oCoverPic); }, onAfterRendering: function (){
//called after instance has been rendered (it's in the DOM)
}, _somePrivateMethod : function () { /*do someting...*/ }, somePublicMethod : function () { /*do someting...*/ }, renderer : { render : function(oRm, oControl) { oRm.write("<div");
oRm.writeControlData(oControl); oRm.addClass("nsBook");
oRm.writeClasses(); oRm.addStyle("width", oControl.getWidth());
oRm.addStyle("height", oControl.getHeight());
oRm.writeStyles(); oRm.write(">"); //content: oRm.write("<div>");
oRm.renderControl(oControl.getCoverPicture());
oRm.write("</div>"); //we don't do any fancy stuff because we are lazy ;-)
//oRm.writeEscaped("<div>escape this</div>");
oRm.write("<div>");
oRm.write("<div>Title : "+oControl.getTitle()+"</div>");
oRm.write("<div>Author : "+oControl.getAuthor()+"</div>");
oRm.write("<div>Description : "+oControl.getDescription()+"</div>");
oRm.write("<div>Price : "+oControl.getPrice().toFixed(2)+" "+oControl.getCurrencyCode() +"</div>");
oRm.write("<div>Comments : <br>"+oControl.getComments().join("<br>")+"</div>");
oRm.write("<div>Pages : "+oControl.getNumberOfPages()+"</div>");
oRm.write("<div>Express Delivery : "+oControl.getExpressDelivery()+"</div>");
oRm.write("<div>");
oRm.renderControl(oControl.getAggregation("_buyButton"));
oRm.write("</div>");
oRm.write("</div>"); oRm.write("</div>"); // close the nsBook div
}
}
}); //overwrite setter
nabisoft.bookstore.controls.Book.prototype.setCoverPictureUrl = function (sVal) {
if (sVal) {
this.setProperty("coverPictureUrl", sVal, /*suppressInvalidate*/ true); //do not re-render
this.getCoverPicture().setSrc(sVal);
}
}; nabisoft.bookstore.controls.Book.prototype.exit = function () {
/* release resources that are not released by the SAPUI5 framework */
if (this._oLink){
this._oLink.destroy();
delete this._oLink;
}
}; return Book; }); //### Controller (usually in a separate file) ###
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function (Controller) {
"use strict"; return Controller.extend("nabisoft.my.Controller", {
onInit : function () {
var oBook = this.byId("myBook");
oBook.addEventDelegate({
onAfterRendering: function(){
//called after the instance has been rendered (it's in the DOM)
}
});
},
onBuy : function(oEvent){
var oBook = oEvent.getSource();
alert("Buy event received: '" + oBook.getTitle() + "' by " + oBook.getAuthor());
},
onAfterRendering: function(){
//called after the view has been rendered (it's in the DOM)
}
});
}); //### place the XMLView somewhere into DOM (usually in a separate file) ###
sap.ui.xmlview({
viewContent : jQuery("#myXmlView").html()
}).placeAt("contentXMLView"); //### or we create an instance via JavaScript and place it into the DOM (XMLView is preferred in real apps)
// in a perfect world we would use dependency injection, but this is just an imperfect tutorial :-)
var oBook = new nabisoft.bookstore.controls.Book({
height:"auto",
title: "My Book via JavaScript",
author: "My Author",
description: "This is a Book about...",
price: 49.90,
currencyCode: "EUR",
comments: ["Great book!", "A must have!", "I liked chapter 6 the most!"],
numberOfPages: 293,
coverPictureUrl: "https://lorempixel.com/150/200/",
expressDelivery: true,
relatedBooks: [],
buy : function(oEvent){
var oBook = oEvent.getSource();
alert("Buy event received: '" + oBook.getTitle() + "' by " + oBook.getAuthor());
}
});
oBook.addEventDelegate({
onAfterRendering: function(){
//called after the instance has been rendered (it's in the DOM)
}
});
oBook.placeAt("contentPlayinJs");
});
</script> </head> <body class="sapUiBody" role="application">
<div id="contentXMLView" style="padding:10px"></div>
<hr style="margin:20px;">
<div id="contentPlayinJs" style="padding:10px"></div>
</body> </html>

2.页面测试

UI5-技术篇-SAPUI5创建自定义控件-LMLPHP

UI5-技术篇-SAPUI5创建自定义控件-LMLPHP

UI5-技术篇-SAPUI5创建自定义控件-LMLPHP

05-22 10:56