UI5 - XML片段中的格式化程序只执行一次。如何再次运行它们?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UI5 - XML片段中的格式化程序只执行一次。如何再次运行它们?相关的知识,希望对你有一定的参考价值。

当UI5呈现sap.ui.xmlfragment时,格式化程序只执行一次并缓存其结果。然后关闭对话框(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;
  }
}
答案

确实有一种方式是saoirse在回答中提出的建议。没有参数的sap.ui.model.Model#refresh将触发绑定属性的更新,因此如果绑定数据已更改,则调用格式化程序。如果您希望再次调用格式化程序,即使模型数据相同(但可能某些控制器属性已更改),则可以将true标志传递给refresh方法:oModel.refresh(true)。该参数具有以下功能:

bForceUpdate - 即使数据尚未更改,也会更新控件

此外,另一个解决您的问题的版本,假设您使用双向绑定或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;
  }
}

更改时自动更新的原因如下:使用浅比较检测更改。模型的数据对象的引用在您的示例中不会更改(仅更改组件值),因此不会检测到任何更改。在我的版本中,每个原始组件都是单独监视的,并且由于绑定机制(因此重新调用格式化程序),对一个值的更改将触发更新。

另一答案

每次更改绑定或刷新模型时都会调用格式化程序。在您的情况下,最简单的方法可能是在触发open()时将模型刷新或重新绑定到Dialog。

另一答案

你可以在关闭它时销毁它。它会破坏你的碎片。当您单击“打开片段”按钮时,将再次创建新片段并将发生数据绑定。

干杯!

以上是关于UI5 - XML片段中的格式化程序只执行一次。如何再次运行它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理片段中的onClick [重复]

UI5-文档-2.5-开发混合Web容器

有选择性的启用SAP UI5调试版本的源代码

UI5-文档-4.19-Reuse Dialogs

UI5-文档-4.21-Data Types

ABAP, UI5和webpack的处理入口