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

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

我的自定义控件的数据绑定有问题。

我的控件继承自 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. 欢迎任何想法。

sapui5
1个回答
0
投票

下面是一个工作示例。https:/embed.plnkr.coVa7C1BpyiV1jEV87。

一般来说,监听对象应该总是作为一个参数传递,而不是使用 监听对象应始终作为参数传递,而不是使用 bind:

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

在我们的情况下,可以完全省略监听人: 可以完全省略监听器。

this.attachValueHelpRequest(this.onValueHelpRequest);

然后,框架将把当前的事件提供者(控制实例)作为监听器对象,如API参考中所述。

如果... <oListener&gt.没有指定,处理函数在事件提供者的上下文中被调用。 未指定,处理函数在事件提供者的上下文中被调用。(来源)


为什么会这样?.bind(this) 时好时坏

如果该控件是作为模板控件提供的(例如在 <table:template> 如问题中所示),UI5使用该模板的 clone API,其中所有注册的事件处理程序也被考虑在内。(代码).

当事件处理程序在 initజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ 这个Argthis.onValueHelpRequest.bind(thisArg) 是模板控制。 的克隆实例,它拥有所有的绑定。更糟糕的是 bind 不会让你改变之前通过的 这个Arg 纵使框架 试图 call 之后再换一个功能 这个Arg 根据 规范 (见注2)。

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

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