我的自定义控件的数据绑定有问题。
我的控件继承自 sap.m.Input
并用一个特殊的值帮助器来扩展它。我的新控件的一个新属性是一个简单的值帮助对话框的头。它被绑定到一个i18n模型上。
当我现在在一个正常的表单中使用我的控件时,一切都能正常工作。标题被正确地绑定,并显示了该模型中绑定的i18n属性的值。如果我将我的控件作为模板使用在一个列的 sap.ui.table
控件,它只显示标题属性的默认值。数据绑定似乎不起作用。但对继承的属性(如value)仍然有效。
为了简化,我的控件现在只有title属性,如果请求valuehelp,它就会在一个警报框中显示当前值。在表格中,它显示的是默认值。而在没有表格的情况下,它显示的是i18n模型的约束值。
这里是简化的控件代码。
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() {
Input.prototype.init.call(this);
this.setShowValueHelp(true);
this.attachValueHelpRequest(this.onValueHelpRequest.bind(this));
},
onValueHelpRequest: function(oEvent) {
var lvTitle = this.getVhTitle();
alert(lvTitle);
},
});
});
});
控件的用法 sap.ui.table.Table
(不工作,显示标题属性的默认值)。
<table:Column>
<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>
再一次,对值属性的绑定在两种情况下都有效。问题只存在于我自己的属性 vhTitle
. 欢迎任何想法。
下面是一个工作示例。https:/embed.plnkr.coVa7C1BpyiV1jEV87。
一般来说,监听对象应该总是作为一个参数传递,而不是使用 监听对象应始终作为参数传递,而不是使用 bind
:
this.attachValueHelpRequest(this.onValueHelpRequest.bind(this), this);
在我们的情况下,可以完全省略监听人: 可以完全省略监听器。
this.attachValueHelpRequest(this.onValueHelpRequest);
然后,框架将把当前的事件提供者(控制实例)作为监听器对象,如API参考中所述。
如果... <oListener>.没有指定,处理函数在事件提供者的上下文中被调用。 未指定,处理函数在事件提供者的上下文中被调用。(来源)
.bind(this)
时好时坏如果该控件是作为模板控件提供的(例如在 <table:template>
如问题中所示),UI5使用该模板的 clone
API,其中所有注册的事件处理程序也被考虑在内。(代码).
当事件处理程序在 init
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ 这个Arg 在 this.onValueHelpRequest.bind(thisArg)
是模板控制。不 的克隆实例,它拥有所有的绑定。更糟糕的是 bind
不会让你改变之前通过的 这个Arg 纵使框架 试图 call
之后再换一个功能 这个Arg 根据 规范 (见注2)。
这导致从模板中获取旧的值,而不是从渲染的克隆中获取实际值。