Как использовать условие if/else в XML-представлении sapUI?

Как я могу реализовать условие if/else в XML-представлении в SapUI5, которое использует флаг (условие) из 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-препроцессора overkill-feeling?

3 ответов


OpenUI5 поддерживает Инструкции По Предварительной Обработке и Выражение Привязки

С Инструкции По Предварительной Обработке вы можете делать вещи, как это

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

вот тут Выражение Привязки может быть удобно: он позволяет использовать сложные выражения в фигуре скобки

<template:if test="{= ${marketed} === true}">

редактировать

следующее решение может быть более простым, но, кажется, немного hacky.

внедрите оба элемента в XML-представление, но переключите видимость со сложной привязкой выражения.

<Label text="product is marketed" visible="{= ${marketed} === true}"/>
<Image src="path.jpg" visible="{= ${marketed} === false}"/>

Я не уверен, что получил ваше требование, но похоже, что просто привязка видимого атрибута к рыночному флагу будет делать.

Если вам нужно связать отрицательным образом, вы можете использовать привязку выражения, например

 visible="{= !${/marketed}}"

если я правильно понял ваш вопрос, вы можете использовать функцию форматирования.

<Label text="{
    path: 'marketed'
    formatter: '.formatter.marketed'
}"/>

.formatter.marketed в этом примере ссылается на функцию в отдельном форматере.файл 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

в вашем примере, поскольку это всего лишь метка, мы возвращаем пустой строка, поэтому она будет пустой. Метка по-прежнему будет отображаться, но это пустая строка, поэтому показывать нечего, поэтому пользователь никогда не узнает, что она есть. Я не совсем уверен, но если ты вернешься ... --3--> вместо пустой строки метка может вообще не отображаться.