Loop Context是mako中用于跟踪for循环状态的一种机制,使用好它可以在写循环时建设不少代码量。例如
<ul>
% for a in ("one", "two", "three"):
<li>Item ${loop.index}: ${a}</li>
% endfor
</ul>
将生成如下内容:
<ul>
<li>Item 0: one</li>
<li>Item 1: two</li>
<li>Item 2: three</li>
</ul>
这里的index是一个以0开始的计数。
一、Loop Context常见用法
Loop Context不仅有index技术,还包含了很多index的变种。如:
* loop.even 计数是否是偶数
* loop.odd 计数是否是奇数
* loop.first 是否是第一项
如果被循环的参数有__len__属性,那么还有:
* loop.reverse_index 反向计数,由len-1到0
* loop.last 是否是最后一项
Loop Context中一个比较特殊的用法是cycle,它能根据循环计数反复遍历一个既定的列表。举个例子:
<ul>
% for item in ('spam', 'ham', 'eggs'):
<li class="${loop.cycle('even', 'odd')}">${item}</li>
% endfor
</ul>
将生成如下内容:
<ul>
<li class="even">spam</li>
<li class="odd">ham</li>
<li class="even">eggs</li>
</ul>
这种用法在一些列表效果(如列表中行行之间背景色循环间隔)处理中非常方便。
二、多重循环
在表格生成过程中,经常会用一个for显示tr,里面在内嵌一个for 显示td。这种时候在子循环中可能需要访问父循环的计数,在一般程序里,会用类似i,j这样两个变量,在mako中,有了Loop Context,完全不需要定义这样的变量。如:
<table>
% for consonant in 'pbj':
<tr>
% for vowel in 'iou':
<td class="${'black' if (loop.parent.even == loop.even) else 'red'}”> # 父子循环技术同为奇、偶,显示black,否则显示red
${consonant + vowel}t
</td>
% endfor
</tr>
% endfor
</table>
将显示:
<table>
<tr>
<td class="black">
pit
</td>
<td class="red">
pot
</td>
<td class="black">
put
</td>
</tr>
<tr>
<td class="red">
bit
</td>
<td class="black">
bot
</td>
<td class="red">
but
</td>
</tr>
<tr>
<td class="black">
jit
</td>
<td class="red">
jot
</td>
<td class="black">
jut
</td>
</tr>
</table>
可以看的出,Loop Context可以通过loop.parent来访问上一级循环,如果有更多重的循环,则可以用loop.parent.parent....来访问。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment