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

Posted

技术标签:

【中文标题】UI5 - XML 片段中的格式化程序只执行一次。如何再次运行它们?【英文标题】:UI5 - Formatters in XML fragment are executed only once. How to run them again? 【发布时间】:2018-03-05 15:55:36 【问题描述】:

当一个 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;
  

【问题讨论】:

【参考方案1】:

西尔莎在他们的回答中确实建议了一种方法。没有参数的sap.ui.model.Model#refresh 将触发绑定属性的更新,因此如果绑定数据已更改,则调用格式化程序。如果即使模型数据相同(但可能某些控制器属性已更改)也希望再次调用格式化程序,则可以将true 标志传递给刷新方法: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;
  

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

【讨论】:

嗨。感谢您提供详细而详细的答案。 UI5 对我来说是新的,听到/阅读更有经验的同事的知识总是很高兴。 这是否意味着每次模型的值发生变化时我们都应该为模型重新创建一个新的参考?由于绑定是使用浅比较更新的,所以我没有看到另一种强制刷新的方法(不调用 refresh(true)),而不是为模型重新创建一个全新的引用......这不是一个坏习惯吗?我的意思是,重新创建一个新的引用是一种 malloc/realloc 调用,它不是那么快,因为它是一个内核调用......【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以在关闭片段时将其销毁。它会破坏你的片段。当您单击 Open Fragment 按钮时,将再次创建新的片段并进行数据绑定。

干杯!

【讨论】:

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

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

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

UI5-文档-4.19-Reuse Dialogs

UI5-文档-4.21-Data Types

ABAP, UI5和webpack的处理入口

SAP UI5 如何在 xml 视图中附加 HTML