咨询一个模板引擎嵌套循环的问题

先贴一下我的数据格式:

{
"list_index":["a","b","c",...,"z"],
"a":[{},{},...{}],
"b":[{},{},...{}],
...
"z":[{},{},...{}]
}

我的场景很简单,最外层就是a到z的循环,然后里面的话,我要取出对应的列表,然后对列表进行循环。

#for(s : list_index)
    #for(info : 这个地方如何处理)
        #(info.name)
    #end
#end

看了下文档,没有找到解决方案。

评论区

JFinal

2018-11-10 20:31

这个你得有办法获取最外层的 hash 对象,最好是取个名为好,例如:
{root : {
"list_index":["a","b","c",...,"z"],
"a":[{},{},...{}],
"b":[{},{},...{}],
...
"z":[{},{},...{}]
}
}

然后可以这么来玩:
#set(keyList = [ ])
#for ( key : list_index)
#(keyList.add(key), null)
#end

#for ( key : keyList)
#for (x : root.get(key))
#(x.name)
#end
#end

JFinal

2018-11-10 20:36

如果你不想弄 root 这个根 name 来取值,需要做个扩展指令来将 root 对象赋给一个变量,然后取值,例如这么来用:
#setRoot()

然后后面的用法,与前面的完全一样,同样有个 root 对象可以使用
##set(keyList = [ ])
#for ( key : list_index)
#(keyList.add(key), null)
#end

#for ( key : keyList)
#for (x : root.get(key))
#(x.name)
#end
#end

关键在于这个 #setRoot() 指令怎么实现,其实极其简单,大致代码如下:
public class SetRootDirective extends Directive {
public void exec(Env env, Scope scope, Writer writer) {
scope.set("root", scope.getRootData());
}
}

本质就一行代码解决问题: scope.set("root", scope.getRootData());

最后别忘了配置一下:
engine.addDirective("setRoot", SetRootDirective.class);

happyboy

2018-11-11 10:43

@JFinal 谢谢波总,思路我明白了。昨天晚上着急用,用了个笨办法,把最外层的循环放在java里处理了。^_^

happyboy

2018-11-11 11:00

@JFinal 另外,我的这种场景在java中还是比较常见的,内部循环要使用外层循环的值进行利用处理,是否考虑下个版本对这种场景增强一下,这种场景如果是放在java中的话,处理起来是很方便的。比如,如果可以这样处理,是不是会好些。
#for(s : list_index)
#for(info : eval(#(s)))
#(info.name)
#end
#end
相信波总有更好的考虑,(* ̄︶ ̄)。

JFinal

2018-11-11 15:34

@happyboy 可以扩展一个 #eval 指令出来,这类功能扩展起来很方便