我的自定义控件的数据绑定有问题。我的控件继承自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”中。欢迎任何想法。
这里是一个有效的示例: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)。 )。
这导致从模板中获取旧值,而不是从呈现的克隆中获取实际值。