如何使用 XML 字符串以编程方式创建片段
How to programmatically create fragment using XML string
我有一个包含 XML 片段定义的字符串,我想使用它创建一个控件。
XML 字符串示例:
var sFrag = "<core:FragmentDefinition xmlns='sap.m' xmlns:core='sap.ui.core'>
<Dialog showHeader='false' class='transparentBG dialogScrollHeight100' contentWidth='90%' afterClose='dialogAddNewAfterclose'>
<content>
<Button text='X' press='closeDialog'/>
<Text text='Hello Meirav!'/>
<HBox alignItems='Center'>
<Label text='Product Name: '/>
<Label text='{currentProduct>/Name}'/>
</HBox>
<HBox height='30px'/>
<HBox alignItems='Center'>
<Label text='Product Price: '/>
<Input value='{currentProduct>/Price}'/>
</HBox>
<HBox height='30px' />
<Button text='Save Update' press='saveUpdateFromFrag'/>
</content>
</Dialog>
</core:FragmentDefinition>"
可能吗?
是的,类似于 ,Fragment 也支持从 XML 字符串创建控件。
UI5≥1.58
globalThis.onUI5Init = () => sap.ui.require([
"sap/ui/core/Fragment",
"sap/m/Button",
], async (Fragment, Button) => {
"use strict";
const dialog = await Fragment.load({
definition: `<Dialog xmlns="sap.m"
title="My Dialog"
class="sapUiResponsiveContentPadding">
<Text text="Some Dialog content.." />
<beginButton>
<Button id="myBeginButton"
text="Handle Event from Fragment"
press=".onBeginButtonPress" />
</beginButton>
</Dialog>`,
controller: { // can be just "this" in a Controller definition.
onBeginButtonPress: () => alert("Event handler triggered!"),
},
});
new Button({
text: "Open Dialog",
press: () => dialog.open(),
}).placeAt("content");
});
<script defer id="sap-ui-bootstrap"
src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"
data-sap-ui-libs="sap.ui.core,sap.m"
data-sap-ui-async="true"
data-sap-ui-oninit="onUI5Init"
data-sap-ui-theme="sap_fiori_3"
data-sap-ui-compatversion="edge"
data-sap-ui-excludejquerycompat="true"
data-sap-ui-xx-waitfortheme="init"
></script>
<body id="content" class="sapUiBody sapUiSizeCompact"></body>
API Reference: sap/ui/core/Fragment.load
PS: 这里不是这样的,可以去掉。
UI5≤1.56
如果使用旧版本,您将不得不退回到已弃用的 API sap.ui.xmlfragment
.
const fragmentContent = `<Dialog xmlns="sap.m"><!-- ... --></Dialog>`;
const dialog = sap.ui.xmlfragment({ fragmentContent }, this);
而不是definition
,需要将字符串内容分配给属性 fragmentContent
,控制器实例应该作为第二个参数传递(this
).
我有一个包含 XML 片段定义的字符串,我想使用它创建一个控件。
XML 字符串示例:
var sFrag = "<core:FragmentDefinition xmlns='sap.m' xmlns:core='sap.ui.core'>
<Dialog showHeader='false' class='transparentBG dialogScrollHeight100' contentWidth='90%' afterClose='dialogAddNewAfterclose'>
<content>
<Button text='X' press='closeDialog'/>
<Text text='Hello Meirav!'/>
<HBox alignItems='Center'>
<Label text='Product Name: '/>
<Label text='{currentProduct>/Name}'/>
</HBox>
<HBox height='30px'/>
<HBox alignItems='Center'>
<Label text='Product Price: '/>
<Input value='{currentProduct>/Price}'/>
</HBox>
<HBox height='30px' />
<Button text='Save Update' press='saveUpdateFromFrag'/>
</content>
</Dialog>
</core:FragmentDefinition>"
可能吗?
是的,类似于
UI5≥1.58
globalThis.onUI5Init = () => sap.ui.require([
"sap/ui/core/Fragment",
"sap/m/Button",
], async (Fragment, Button) => {
"use strict";
const dialog = await Fragment.load({
definition: `<Dialog xmlns="sap.m"
title="My Dialog"
class="sapUiResponsiveContentPadding">
<Text text="Some Dialog content.." />
<beginButton>
<Button id="myBeginButton"
text="Handle Event from Fragment"
press=".onBeginButtonPress" />
</beginButton>
</Dialog>`,
controller: { // can be just "this" in a Controller definition.
onBeginButtonPress: () => alert("Event handler triggered!"),
},
});
new Button({
text: "Open Dialog",
press: () => dialog.open(),
}).placeAt("content");
});
<script defer id="sap-ui-bootstrap"
src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"
data-sap-ui-libs="sap.ui.core,sap.m"
data-sap-ui-async="true"
data-sap-ui-oninit="onUI5Init"
data-sap-ui-theme="sap_fiori_3"
data-sap-ui-compatversion="edge"
data-sap-ui-excludejquerycompat="true"
data-sap-ui-xx-waitfortheme="init"
></script>
<body id="content" class="sapUiBody sapUiSizeCompact"></body>
API Reference: sap/ui/core/Fragment.load
PS:
UI5≤1.56
如果使用旧版本,您将不得不退回到已弃用的 API sap.ui.xmlfragment
.
const fragmentContent = `<Dialog xmlns="sap.m"><!-- ... --></Dialog>`;
const dialog = sap.ui.xmlfragment({ fragmentContent }, this);
而不是definition
,需要将字符串内容分配给属性 fragmentContent
,控制器实例应该作为第二个参数传递(this
).