UI5 - XML 片段中的格式化程序仅执行一次。如何再次 运行 他们?
UI5 - Formatters in XML fragment are executed only once. How to run them again?
当 sap.ui.xmlfragment 由 UI5 呈现时,格式化程序仅执行一次并缓存其结果。然后对话框关闭( dialog.close() ),用户更改例如语言,然后再次运行对话框( dialog.open() )。
但格式化程序不会再次评估,因此会显示之前的状态。
如何强制再次执行它们?
我的 XML 看起来像这样:
<Label text="{path: 'myModel>', formatter: '.myMethodInController'}"/>
和格式化程序:
myMethodInController: function(myObject){
if (myObject.a == 1 || myObject.b == 2)
{
return myObject.c;
}
else
{
return myObject.d;
}
}
每次更改绑定或刷新模型时都会调用格式化程序。在您的情况下,最简单的方法可能是在触发 open() 时刷新模型或将模型重新绑定到对话框。
一种方式确实是saoirse在他们的回答中所建议的。不带参数的 sap.ui.model.Model#refresh 将触发绑定属性的更新,因此如果绑定数据已更改 ,则会调用格式化程序 。如果您希望即使模型数据相同(但可能某些控制器 属性 已更改)再次调用格式化程序,则可以将 true
标志传递给刷新方法:oModel.refresh(true)
.该参数具有以下作用:
bForceUpdate - Update controls even if data has not been changed
此外,假设您使用 two-way 绑定或 setProperty
调用仅更改模型数据,解决您问题的另一个版本是对每个原始模型进行复合绑定 属性 你使用:
查看:
<Label text="{
parts: [
{path: 'myModel>/a'},
{path: 'myModel>/b'},
{path: 'myModel>/c'},
{path: 'myModel>/d'}
],
formatter: '.myMethodInController'}"/>
格式化程序:
myMethodInController: function(a, b, c, d){
if (a == 1 || b == 2) {
return c;
} else {
return d;
}
}
更改时自动更新的原因如下:使用浅比较检测到更改。您的模型的数据对象的引用在您的示例中没有变化(只有组件值发生变化),因此未检测到任何变化。在我的版本中,每个原始组件都被单独监视,并且由于绑定机制(因此 re-call 您的格式化程序),对一个值的更改将触发更新。
您可以在关闭片段时销毁它。它会破坏你的片段。当您单击“打开片段”按钮时,将再次创建新的片段并进行数据绑定。
干杯!
当 sap.ui.xmlfragment 由 UI5 呈现时,格式化程序仅执行一次并缓存其结果。然后对话框关闭( dialog.close() ),用户更改例如语言,然后再次运行对话框( dialog.open() )。
但格式化程序不会再次评估,因此会显示之前的状态。
如何强制再次执行它们?
我的 XML 看起来像这样:
<Label text="{path: 'myModel>', formatter: '.myMethodInController'}"/>
和格式化程序:
myMethodInController: function(myObject){
if (myObject.a == 1 || myObject.b == 2)
{
return myObject.c;
}
else
{
return myObject.d;
}
}
每次更改绑定或刷新模型时都会调用格式化程序。在您的情况下,最简单的方法可能是在触发 open() 时刷新模型或将模型重新绑定到对话框。
一种方式确实是saoirse在他们的回答中所建议的。不带参数的 sap.ui.model.Model#refresh 将触发绑定属性的更新,因此如果绑定数据已更改 ,则会调用格式化程序 。如果您希望即使模型数据相同(但可能某些控制器 属性 已更改)再次调用格式化程序,则可以将 true
标志传递给刷新方法:oModel.refresh(true)
.该参数具有以下作用:
bForceUpdate - Update controls even if data has not been changed
此外,假设您使用 two-way 绑定或 setProperty
调用仅更改模型数据,解决您问题的另一个版本是对每个原始模型进行复合绑定 属性 你使用:
查看:
<Label text="{
parts: [
{path: 'myModel>/a'},
{path: 'myModel>/b'},
{path: 'myModel>/c'},
{path: 'myModel>/d'}
],
formatter: '.myMethodInController'}"/>
格式化程序:
myMethodInController: function(a, b, c, d){
if (a == 1 || b == 2) {
return c;
} else {
return d;
}
}
更改时自动更新的原因如下:使用浅比较检测到更改。您的模型的数据对象的引用在您的示例中没有变化(只有组件值发生变化),因此未检测到任何变化。在我的版本中,每个原始组件都被单独监视,并且由于绑定机制(因此 re-call 您的格式化程序),对一个值的更改将触发更新。
您可以在关闭片段时销毁它。它会破坏你的片段。当您单击“打开片段”按钮时,将再次创建新的片段并进行数据绑定。
干杯!