使用部件和静态值调用格式化程序不起作用

Calling formatter with parts and static value doesn't work

基本上我想使用格式化程序函数根据一些静态值填充 sap.m.ObjectStatustextstateicon)的 3 个属性。

<m:ObjectStatus
  text="{
    parts: [
      { path: 'currentRoles>STATE_TEXT' },
      { path: 'currentRoles>STATE' },
      { path: 'currentRoles>REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE' },
      { path: 'currentRoles>invalid' },
      { value: 'text' }
    ],
    formatter: '.formatter.Formatter.convertRoleStatus'
  }"
  ...
/>

奇怪的是;如果我在 XML 中省略 value 部分,则调用该函数。如果包含它,则该函数从一开始就不会被调用。

根据 post Pass Static Value to Formatter Parameters in XML View 的答案之一,如果 UI5 版本高于 1.61,则使用 value 传递参数应该有效。我们使用 1.71.2.

在代码的其他地方,这有效。

如何解决这个问题?

我怀疑存在限制(可能是错误):

如果您不使用命名模型,这对我有用:

... ??="{ parts : [ {path: 'a'}, {path: 'b'}, {path: 'c'}, {path: 'd'}, {value: 23} ], formatter: '.myFormatter'}"

...

let model = new JSONModel(this.getData());
this.getView().setModel(model);

...

myFormatter: function (a, b, c, d, v) {
  console.log(a, b, c, d, v);
},
getData: function(){
  return {"testdata": [
    { a: 1, b: "stringB", c: "stringC", d: "stringD"},
    ]};
  }

控制台输出:1 "stringB" "stringC" "stringD" 23

当我命名我的模型时,它就停止工作了。 现在,如果可能,请为您的数据使用默认模型 - 不理想?!

在将命名模型指定为默认(未命名)模型后尝试(您可能需要进行一些模型名称交易?!):

parts: [
            {path: 'STATE_TEXT'},
            {path: 'STATE'},
            {path: 'REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE'},
            {path: 'invalid'},
            {value: 'text'}
        ],

虽然这让它起作用了,但您可能想向 UI5 团队提出这个问题?

至于现在,因为像 Bernard 提议的那样将绑定更改为默认绑定是不可能的,而不需要进行大量重构,所以我稍微更改了格式化程序逻辑,例如创建 3 个单独的函数(带有 4 个参数)调用原始的 convertRoleStatus 函数,每个函数都有不同的第五个参数输入,即模式。
我会向 SAP 报告问题,希望有一天能解决它。

更新: 问题现在已通过 commit: 4a9cf89 解决,它将在 1.80+ 中可用。
现在即使没有像下面提到的任何解决方法,也可以使用静态绑定。


原始答案(解决方法):

此问题现已在 https://github.com/SAP/openui5/issues/2916 中报告。感谢您让我们意识到这一点!

快速 "fix"(我会说 猴子补丁 )是将 model: 'myExistingModel' 添加到静态绑定信息:

部分:[
  { 路径: 'currentRoles>STATE_TEXT' },
  { 路径: 'currentRoles>STATE' },
  { 路径: 'currentRoles>REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE' },
  { 路径: 'currentRoles>invalid' },
  { 值:'text'<strong>,模型:'currentRoles'</strong> }
],

这个修复实际上没有意义,因为静态绑定没有任何模型,但可以在官方修复到来之前使用,而不需要进行大量重构。