使用部件和静态值调用格式化程序不起作用
Calling formatter with parts and static value doesn't work
基本上我想使用格式化程序函数根据一些静态值填充 sap.m.ObjectStatus
(text
、state
、icon
)的 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> }
],
这个修复实际上没有意义,因为静态绑定没有任何模型,但可以在官方修复到来之前使用,而不需要进行大量重构。
基本上我想使用格式化程序函数根据一些静态值填充 sap.m.ObjectStatus
(text
、state
、icon
)的 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> }
],
这个修复实际上没有意义,因为静态绑定没有任何模型,但可以在官方修复到来之前使用,而不需要进行大量重构。