在深入挖掘代码后,我看到控件上的invalidate()
会增加一个计数器,似乎将控件标记为无效。
这似乎导致了一个退隐。
因此,如果你有一个想要重新渲染的控件,最好使用invalidate()
或rerender()
?
如何实际触发重新投降? (当然除了明确地调用它)
答案 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()
invalidate()
只是将控件添加到要呈现的控件的集合中,以便可以在一个过程中与它们一起呈现 (当前在下一个使用setTimeout(fn, 0)
的浏览器任务中)