自定义 UI5 控件不更新绑定值

Custom UI5 control does not update bound value

如何将 OData 值传递给自定义 UI5 控件的 属性?我试过了,但是 不工作
如果我尝试将它传递给像 <Text> 这样的正常控件,它 工作 很好。
如果我尝试传递一个静态值,它 工作 也很好:

<cc:CheckPrice valuePrice="{Price}"/> <!--❌-->
<Text text="{Price}"/> <!--✔️-->
<cc:CheckPrice valuePrice="1000"/> <!--✔️-->

如何从远程 OData 服务传递值以像在文本控件中一样显示它?

sap.ui.define([
    "sap/ui/core/Control",
    "sap/m/Label",
    "sap/m/Button"
], function (Control, Label, Button) {
    "use strict";

    return Control.extend("zgutfiory.zguttestfiorylr.controls.CheckPrice", {
        metadata: {
            properties: {
                "valuePrice": {
                    type: "string",
                    bindable: "bindable"
                }
            },
            aggregations: {
                "_label": {
                    type: "sap.m.Label",
                    multiple: false,
                    visibility: "hidden"
                },
                "_button": {
                    type: "sap.m.Button",
                    multiple: false,
                    visibility: "hidden"
                }
            },
            events: {
                // ...
            }
        },

        init: function () {
            this.setAggregation("_label", new Label({
                text: "{i18n>controlCheckPrice}"
            }).addStyleClass("sapUiSmallMargin"));
            this.setAggregation("_button", new Button({
                text: "{i18n>controlCheckPrice}",
                press: [this._onSubmit, this]
            }).addStyleClass("sapUiTinyMarginTopBottom"));
        },

        _onSubmit: function (oEvent) {
            // ...
        },

        renderer: function (oRm, oControl) {
            oRm.write('<div class="zgutCheckPriceWrap">');
            oRm.write('<div class="zgutPriceWrap">' + oControl.getValuePrice() + '</div>');
            oRm.renderControl(oControl.getAggregation("_label"));
            oRm.renderControl(oControl.getAggregation("_button"));
            oRm.write('</div>');
        }
    });
});

UI5版本:1.92

自定义控件的绑定与标准控件完全相同。必须考虑以下几点:

  • 如果父容器,例如视图与上下文绑定,您必须提供您绑定值的属性的相对路径,例如{Price}。否则,给出绝对路径,例如{/Price}
  • 如果模型已命名,请务必在绑定时提供名称。例如。 {namedModel>/Price}
  • 路径也可以是多级的。例如。 {ToCategory/CategoryName} 用于 OData 属性 使用 NavigationProperty 绑定 ToCategory

您似乎只是漏掉了前导斜杠?

<cc:checkPrice id="checkPrice" valuePrice="{/Price}" class="sapUiSmallMarginBeginEnd" />

您错过了在渲染函数中添加一些强制控制数据。当模型值发生变化时(例如 ODataModel 接收数据),具有绑定 属性 的控件至少需要由 id 识别,以便控件可以更新。在您的情况下,id 未呈现。

要添加所需的控制数据,请使用:

  • oRm.openStart("div"<strong>, oCotrol</strong>) 在新的情况下 语义渲染 (UI5 ≥ 1.67).
  • oRm<strong>.writeControlData(oControl)</strong> 在现在已弃用的 基于字符串的渲染中 (UI5 ≤ 1.66)。 注意:这里oControl.getValuePrice()请用.writeEscaped来避免XSS。

此外,如果覆盖借用的方法(例如 init),请确保调用超级函数。这对于生命周期挂钩尤其重要。

样本:https://embed.plnkr.co/gnmPoh3KS7L3DDXZ?show=controls%2FCheckPrice.js,preview


有关详细信息,请参阅 API reference: sap/ui/core/RenderManager