SAPUI5:invalidate和rerender之间的区别

时间:2015-01-09 19:02:08

标签: javascript rendering sapui5

在深入挖掘代码后,我看到控件上的invalidate()会增加一个计数器,似乎将控件标记为无效。 这似乎导致了一个退隐。

因此,如果你有一个想要重新渲染的控件,最好使用invalidate()rerender()

如何实际触发重新投降? (当然除了明确地调用它)

3 个答案:

答案 0 :(得分:5)

两者都标记为"受保护",这意味着除非您真正深入开发自定义控件,否则不应调用其中任何一个。

当(例如)属性发生更改时,控件将失效。在这种情况下,您通常需要重新呈现控件,这就是默认情况下setter调用invalidate的原因。

当您在自定义控件中覆盖invalidate方法时,您可以分析失效的来源,然后决定是否真的要重新渲染等。例如,参见unified.Shell,它决定如何对invalidate进行基于资源: https://sapui5.netweaver.ondemand.com/sdk/resources/sap/ui/unified/Shell-dbg.js第1539ff行

再次:受保护意味着不应该从外部调用它(并且除了调试之外它不应该是必需的。)

答案 1 :(得分:1)

我最近在工作中遇到过这样的事情。我正在修复动画问题,但不好的是我必须在渲染后启动动画。如果这就是我能处理的全部,但更糟糕的是控制渲染两次。当第一次渲染发生时,动画开始做,但第二次渲染立即出现并且DOM被重建,然后动画终止并且效果就像没有动画执行一样。在调查代码之后,我发现有一个地方调用render()方法,它将立即执行渲染。更改它以调用invalidated()方法后,它看起来动画效果很好。它看起来多次invalidate()方法调用只会导致执行一次渲染。

答案 2 :(得分:1)

  

使用invalidate()rerender()是更好的做法吗?

作为应用程序开发人员

invalidate()rerender()都不应该使用,因为它们不是公共API。

作为控件开发人员

通常,如果控件设置(属性,聚合或关联)之一发生更改,则框架已经自动管理控件的重新呈现。但是,如果仍然需要显式触发重新呈现,则应该优先使用API​​ invalidate() 而不是rerender(),因为:

  • rerender()
    • 同步提供控件(阻塞主/ UI线程)
    • 仅在控件之前已渲染(无法进行初始渲染)时起作用
    • 不会将多个状态更改合并到一个重新呈现中
    • 造成其他布局垃圾
    • 从1.70开始,
    • 已被弃用
  • 另一方面,
  • invalidate()只是将控件添加到要呈现的控件的集合中,以便可以在一个过程中与它们一起呈现 (当前在下一个使用setTimeout(fn, 0)的浏览器任务中)
相关问题