dim*_*boo 6 performance zope plone zpt template-tal
我知道为了性能,最好nocall在a 上使用<tal:condition>以避免调用对象.会欣赏(链接)一些背景,因为这对我来说听起来有点模糊:-)
所以你什么时候使用nocall?把它放在我所有的条件下会不会受伤?
谢谢 !
Han*_*ing 12
我倾向于使用tal:condition ="python:variable"代替.这样我就可以总是编写正常的Python表达式,而不必担心默认路径表达式中的魔术行为.
路径表达式将执行许多操作,例如,如果可调用,则调用表达式中的变量.通常你会处理TAL中的工具或内容项,它们都是可调用的.
最常见的错误是使用tal:condition ="content_object".内容对象可能来自许多API,例如调用任何类型的引用字段都将返回内容对象.目录搜索将返回"大脑",但在列表中,您经常需要访问这些属性的更多属性,因此您有一个tal:define ="obj brain/getObject".
调用内容对象会导致呈现对象,就好像浏览器会请求它一样.由于渲染页面通常需要500毫秒到2秒,因此您可以将页面渲染速度降低一段时间.如果你在超过25个项目的循环中执行此操作,我希望页面需要30秒或更长时间才能呈现.
nocall让你获得对象的属性或方法的"处理程序".如果您想知道对象是否具有该属性或方法,您应该使用:
<div tal:condition="nocall:context/method|nothing">
...
</div>
Run Code Online (Sandbox Code Playgroud)
在|nothing作为一个类似的作品except在Python代码块:如果context/method失败(未定义),返回nothing.(这可能不是真正的解释,但是这样工作).
使用的另一个原因nocall是获取已知定义的方法的处理程序,稍后您将使用:
<div tal:define="method nocall:context/method">
<span tal:content="python:method(3)" />
<span tal:content="python:method('hello')" />
<span tal:content="python:method('whatever')" />
</div>
Run Code Online (Sandbox Code Playgroud)