?
问题介绍
在 未来之窗 模板开发中,我们经常使用 volist 标签循环输出数据。当需要在循环中加入 if 条件判断,只输出符合条件的数据时,如何保证序号能够按照实际输出的内容连续递增,而不是使用原始的循环索引呢?
核心问题:volist 自带的 $key 会包含被 if 条件过滤掉的项,导致序号不连续。
!
$key 的局限性
volist 标签自带的 $key 是原始循环的索引,无论 if 条件是否满足,$key 都会随循环次数递增。
示例数据
// 原始数据(3条)
$list = [
['name' => 'A', 'status' => 0], // $key=0
['name' => 'B', 'status' => 1], // $key=1
['name' => 'C', 'status' => 1] // $key=2
];
错误用法示例
<volist name="list" id="vo" key="k">
<if condition="$vo.status eq 1">
序号:{$k} → 名称:{$vo.name}
</if>
</volist>
注意:如果直接使用 $key 作为序号,当有数据被 if 条件过滤时,会出现序号跳号的问题。
✓
解决方案:自定义计数变量
解决思路是:不直接使用 volist 自带的 $key,而是自定义一个“计数变量”,仅在 if 条件成立时让该变量自增。
方法一:基础写法(直接在模板中赋值)
{:($num = 0)}
<volist name="list" id="vo">
<if condition="$vo.status eq 1">
{:($num++)}
→ 名称:{$vo.name} <br>
</if>
</volist>
输出结果(正确递增):
1 → 名称:B
2 → 名称:C
2 → 名称:C
方法二:进阶写法(用 assign 标签显式赋值)
若模板语法更严格,可使用 assign 标签初始化和自增变量,可读性更强:
<assign name="num" value="0" />
<volist name="list" id="vo">
<if condition="$vo.status eq 1">
<assign name="num" value="$num + 1" />
序号:{$num} → 名称:{$vo.name} <br>
</if>
</volist>
输出结果与上面一致,且逻辑更清晰(适合复杂条件场景)。
硬件app