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

     2023-02-27     212

关键词:

【中文标题】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-文档-4.21-datatypes(代码片段)

...价格是87.2,没有货币。我们将使用SAPUI5数据类型正确地格式化价格,使用一个与区域有关的十进制分隔符和分隔符后的两个数字。Preview ThelistofinvoiceswithpricesandnumberunitsCodingYoucanvie 查看详情

testng注解使用(代码片段)

1.TestNG常用注解@Test 标记一个类或方法作为测试的一部分@BeforeMethod 注解的方法将在每个测试方法运行之前运行@AfterMethod 注解的方法将在每个测试方法运行之后运行@BeforeClass 注解的方法将只运行一次,在当前类中所... 查看详情

fragment中的线程只调用一次(代码片段)

...章中所示代码的较短版本。我的错误可能出现在这些代码片段中?这个问题并不重复,因为我提出了一个完全不同的代码片段,这是我遇到的问题的基础。此外 查看详情

javascript只执行一次eventhandler(代码片段)

查看详情

ansible之只执行一次(代码片段)

只执行一次某些时候,我们希望某个task只执行一次,即使它被绑定到了多个主机上。例如在一个负载均衡器后面有多台应用服务器,我们希望执行一个数据库迁移,只需要在一个应用服务器上执行操作即可。可以... 查看详情

在java中如何保证程序模块只被执行一次

...考技术B放在static块里,当类被加载时只会运行一次static中的内容 查看详情

Dojo AMD 加载程序是不是确保模块只执行一次?

】DojoAMD加载程序是不是确保模块只执行一次?【英文标题】:DoesDojoAMDloaderensuremodulesareexecutedonlyonce?DojoAMD加载程序是否确保模块只执行一次?【发布时间】:2013-06-1309:16:53【问题描述】:在一些现有的基于Dojo的应用程序中,我... 查看详情

模块的导入方法(代码片段)

1.模块的使用模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块import多次,为了防止你... 查看详情

从商店下载应用程序时如何只执行一次方法

】从商店下载应用程序时如何只执行一次方法【英文标题】:Howtoexecuteamethodforonlyonetimewhentheapplicationisdownloadedfromstore【发布时间】:2016-05-1319:49:20【问题描述】:我是windows新手。我有一个小问题,即我想在应用程序启动时第一... 查看详情

使用调度线程池执行“指定时间只执行一次”和“指定时间间隔执行”(代码片段)

 ScheduledExecutorServiceexecutorService=newScheduledThreadPoolExecutor(1);executorService.schedule(newTimerTask()@Overridepublicvoidrun()trySystem.out.println(System.currentTimeMillis()+& 查看详情

如何在 Vue 中只执行一次方法?

...口。js文件包含被多次调用的allRecords()函数,这使得检查中的网 查看详情

我的前端组件----多个按钮快速点击只执行最后一次。(代码片段)

缘起:实现一个业务场景时,因为某某某原因,不能让客户对某些按钮进行1秒点10次的骚操作,所以需要实现多个按钮快速点击只执行最后一次。代码<!DOCTYPEhtml><html><head><title>快速点击只执行最后一次</title&g... 查看详情

任务备忘:用python写一个格式化xml字符串的程序(代码片段)

功能:1.将xml中多余的空格,换行符去掉,让xml字符串变成一行。2.将xml中添加缩进,使用print能正确打印添加缩进后的字符串。思路:采用正则表达式来判断xml中字符串的类型:1.文件头2.判断元素的种类:带有属性的标签,没... 查看详情

dowhile只执行一次无意义?你可能真的没理解(代码片段)

在嵌入式开发中,宏定义非常强大也非常便捷,如果正确使用可以让你的工作事半功倍。然而,在很多的C程序中,你可能会看到不是那么直接的比较特殊一点的宏定义,比如dowhile(0)。doconditionalcodewhile(condition)... 查看详情

k6 中的 sleep 功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?

】k6中的sleep功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?【英文标题】:Doesthesleepfunctionink6pauseexecutionofallvirtualusersorjustoneuseratatime?【发布时间】:2020-04-0908:44:57【问题描述】:我是使用https://k6.io进行负载... 查看详情

一次只执行几个线程[重复]

...布时间】:2021-10-1314:07:27【问题描述】:我正在开发一个程序,在该程序中我们不断启动新线程以启动并完成一项工作。我们注意到,即使我们可能启动了10个线程,一次也只有3或4个线程在执行。为了测试它,我做了一个这样... 查看详情

PL/SQL 过程的同步。如何保证一次只执行一个程序? [复制]

】PL/SQL过程的同步。如何保证一次只执行一个程序?[复制]【英文标题】:SynchronisationofPL/SQLprocedure.Howtoguarantyexecutionofprocedureonlyoneattime?[duplicate]【发布时间】:2013-06-2613:40:27【问题描述】:某些PL/SQL过程需要花费大量时间进行评... 查看详情

servlet的生命周期(代码片段)

Servlet_生命周期,:1)被创建:执行init方法,只执行一次2)提供服务:执行service方法,执行多次3)被销毁:当Servlet服务器正常关闭时,执行destroy方法,只执行一次1//servlet生命周期,的三个方法,1.被创建,执行且只执行一次... 查看详情