?

问题介绍

在 未来之窗 模板开发中,我们经常使用 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

方法二:进阶写法(用 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