在我的Typo3扩展中,我们<f:for通过几个项目迭代.完全184项.
我生成一个滑块.
问题是这次迭代极其缓慢.有没有办法加快速度.后端速度不到一秒.只有前端渲染需要很长时间.
我的完整前端代码如下所示:
<f:if condition="{videos -> f:count()} > 4">
<f:then>
<f:for each="{videos}" as="video" iteration="i">
<f:if condition="{i.isFirst}">
<f:then>
<div class="item active">
</f:then>
<f:else>
<div class="item">
</f:else>
</f:if>
<div class="col-lg-3 thumbnailParent">
<f:link.action controller="FrontendVideo" action="show" arguments="{video : video}">
<f:render partial="Video/ShowThumbnail" arguments="{video : video, userAuthorization : userAuthorization}"/>
</f:link.action>
</div>
<!-- adding slider-class to one of all slides. condition: slide must have more than 4 videos for slide-effect -->
<f:if condition="{i.isLast}">
<f:then>
<script type="text/javascript">
addClassForSliding('{myCarouselID}');
function addClassForSliding(myCarouselID) {
$("#myCarousel"+myCarouselID).addClass("isCarousel");
if(!$("div.videoSlide").find("div").hasClass("thisIsTheOnlySliderWhichSlides")){
$("#myCarousel"+myCarouselID).addClass("thisIsTheOnlySliderWhichSlides");
}
}
</script>
</f:then>
<f:else></f:else>
</f:if>
</div>
</f:for>
</f:then>
<f:else>
<f:for each="{videos}" as="video" iteration="i">
<div class="item active">
<div class="col-lg-3">
<f:link.action controller="FrontendVideo" action="show" arguments="{video : video}">
<f:render partial="Video/ShowThumbnail" arguments="{video : video, userAuthorization : userAuthorization}"/>
</f:link.action>
</div>
</div>
</f:for>
</f:else>
</f:if>
Run Code Online (Sandbox Code Playgroud)
<f:else></f:else>.iteration尽可能避免变量.它为每次迭代添加了额外的处理和变量赋值.activeCSS类,从而避免1)像你一样错误地打开和关闭标签,以及2)避免另一个条件,即只有一次是真的,就像另一个一样.<script>除非你有充分的理由,否则不要输出流体.只要有可能,在外部加载脚本并存储脚本所需的任何值,例如data-属性.解析速度更快,循环更快.f:render调用中需要处理的次数越多.不要在开发环境中进行分析!避免iteration和你的条件,以及移动循环外的最后一个块,应该消除80%的成本(不计算你渲染的部分内容 - 它可能是绝对可怕的性能,我们永远不会知道,因为你没有不粘贴那个).
最后,在选择是呈现部分还是部分时,需要考虑几件事情.其中大部分完全取决于您的使用案例(如:您需要如何构建模板 - 使用部分覆盖而不是您不能的部分更有意义吗?)但是可以说一些关于性能:
你总是需要为任务选择合适的工具 - 这是我们作为开发人员的工作之一 - 所以这些要点非常通用.一些用例在部分和部分之间的性能上没有差别,有些使用情况不会明显受到影响iteration; 这一切都取决于您的设置要求和您正在渲染的数据.分析模板肯定有助于找到正确的解决方案,因此我强烈建议您这样做.