如何在SAPUI5的XML-View中实现if-else条件,该条件使用JSONModel
中的标志(条件)?
到目前为止,我有一个控制器:
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel"
], function (Controller, JSONModel) {
"use strict";
return Controller.extend("sap.ui.demo.myApp.myController", {
onInit: function () {
//// set data model on view
var oData = {
title: "A cool title",
values: [{name: "Text 1", marketed: true}, {name: "Text 2", marketed: false}, {name: "Text 3", , marketed: true}]
};
var oModel = new JSONModel(oData);
this.getView().setModel(oModel);
}
});
});
和查看:
<mvc:View
controllerName="sap.ui.demo.myApp.myController"
xmlns="sap.m">
<!-- using aggregation binding -->
<Panel expandable="true" expanded="true" headerText="{/title}" width="100%" content="{/values}">
<content>
<Label text="{name}"/>
<!-- if {marketed}
<Label text="product is marketed"/>
else
add nothing
-->
</content>
</Panel>
</mvc:View>
修改:
有没有比使用矫枉过正的XML预处理器更好的方法呢?
答案 0 :(得分:9)
OpenUI5支持Preprocessing Instructions和Expression Binding。
使用预处理指令,您可以执行以下操作:
<template:if test="{marketed}">
<template:then>
<Label text="product is marketed" />
</template:then>
<template:else>
<Image src="path.jpg" />
</template:else>
</template:if>
我不确定第一行中的test
是否会测试null/not null
或true/false
。这是 Expression Binding 可能很方便的地方:它允许在大括号内使用复杂的表达式:
<template:if test="{= ${marketed} === true}">
修改强>
以下解决方案可能更简单,但似乎有点hacky。
将两个元素嵌入XML视图中,但使用复杂的表达式绑定切换可见性:
<Label text="product is marketed" visible="{= ${marketed} === true}"/>
<Image src="path.jpg" visible="{= ${marketed} === false}"/>
答案 1 :(得分:4)
我不确定我是否满足您的要求,但看起来只是简单地将可见属性绑定到营销标志就可以了。
如果需要以否定方式绑定,可以使用像
这样的表达式绑定 visible="{= !${/marketed}}"
答案 2 :(得分:3)
如果我理解你的问题,你可以使用格式化函数。
<Label text="{
path: 'marketed'
formatter: '.formatter.marketed'
}"/>
此示例中的 .formatter.marketed
引用了一个单独的formatter.js文件中的函数:
marketed: function(marketed) {
if(marketed) {
return 'product is marketed';
} else {
return '';
}
}
请参阅ui5 SDK以了解hpow正确设置格式化程序功能:
https://sapui5.hana.ondemand.com/sdk#docs/guide/0f8626ed7b7542ffaa44601828db20de.html
在你的例子中,因为这只是一个标签,我们返回一个空字符串,所以它只是空白。 Label仍然会被渲染,但它是一个空字符串,所以没有什么可以显示,所以用户永远不会知道它在那里。我不完全确定,但是如果你返回undefined
而不是空字符串,标签可能根本不会被渲染。