UI5自定义控件,在表中使用时数据绑定不起作用

问题描述 投票:1回答:1

我的自定义控件的数据绑定有问题。我的控件继承自sap.m.Input并使用特殊的valuehelper对其进行了扩展。我的新控件的新属性之一是valuehelper对话框的简单Header。这绑定到一个i18n-Model。当我现在以正常形式使用控件时,一切正常。标题已正确绑定,并显示了该模型中已绑定i18n属性的值。如果我在sap.ui.table控件的列中使用控件,则它仅显示title属性的默认值。数据绑定似乎不起作用。但仍在处理继承的属性(例如值)。

为简化起见,我的控件现在仅具有该title属性,如果请求valuehelp,它将在警报框中显示当前值。在表中显示默认值,在表中显示默认值来自i18n-model。

这里是简化的控制代码

sap.ui.define([
    "sap/ui/core/Control",
    "sap/m/Input",
], function(Control, Input ) {
    "use strict";
    return Input.extend("DvpClsSuggestInput", {
            "metadata": {
                "properties": {
                    // Title of Value-Help Dialog
                    "vhTitle"   : { type : "string", defaultValue :"Title" }
                }
            },
            init : function() {
                // Call inherited Method 
                Input.prototype.init.call(this);
                this.setShowValueHelp(true);
                this.attachValueHelpRequest(this.onValueHelpRequest.bind(this));
            },

            renderer: sap.m.InputRenderer,

            // ======= Events
            onValueHelpRequest : function(oEvent) {
                var me = this;
                console.log("DvpClsSuggestInput->open->Entering");
                var lvTitle = this.getVhTitle();
                alert (lvTitle);
            }

    });
});

表中的用法(不起作用,并显示title属性的默认值)

            <table:Column width="6rem" hAlign="Right">
                <m:Label text="{i18gn>HausWaehrung}" />
                <table:template>
                    <dvp:MyInput                                            
                        value="{ path : 'Inv>Hwaer', type : 'sap.ui.model.type.String' }"
                        vhTitle="{i18n>Currency}"/>
                </table:template>
            </table:column>

有效的用法

<VBox>
                    <dvp:MyInput                                            
                        value="{ path : 'Cls>/Currency', type : 'sap.ui.model.type.String' }"
                        vhTitle="{i18n>Currency}"/>
</VBox>

再次。与value属性的绑定有两种方式。问题仅存在于我自己的属性“ vhTitle”中。欢迎任何想法。

sapui5
1个回答
0
投票

这里是一个有效的示例:https://embed.plnkr.co/Va7C1BpyiV1jEV87

一般:侦听器对象应始终作为参数传递,而不是使用bind

this.attachValueHelpRequest(this.onValueHelpRequest.bind(this), this);

在我们的情况下:可以完全省略侦听器:

this.attachValueHelpRequest(this.onValueHelpRequest);

然后,该框架将按照API参考中的描述将当前事件提供程序(控件实例)作为侦听器对象传递:

如果未指定,则在事件提供程序的上下文中调用处理程序函数。 (source)


为什么.bind(this)有时不起作用

[如果控件作为模板控件提供(例如,在问题中显示在<table:template>中),则UI5使用clone API克隆该模板,其中所有注册的事件处理程序也都考虑在内(code)

当事件处理程序在init中注册时,this.onValueHelpRequest.bind(thisArg)中的thisArg是模板控件,not具有所有绑定的克隆实例。更糟的是,即使bind框架之后根据tries to call使用不同的thisArg函数,call也不允许您更改先前传递的thisArg(请参阅注2)。 )。

这导致从模板中获取旧值,而不是从呈现的克隆中获取实际值。

© www.soinside.com 2019 - 2024. All rights reserved.