模板变量能否动态设置变量?

类似java中的String... params,这样就可输入参数,也可以省略参数

使用场景:

有段html代码,在某些模板中需要显示,在某些模板中不显示。这段代码是共用的。并且显示的占据大多数,只有其中几个页面需要显示。例如navbar,在登录页面,不显示,进入后则显示。目前希望共用一个layout.html,只通过一个变量改变这段代码是否显示。默认不显示时,不需要设置该变量的值。

评论区

JFinal

2017-12-04 16:03

用 #define 定义的 template function 的参数个数是固定的,除了性能方面的考虑,本质上是模板引擎是动态类型,不方便像java一样通过类型去判断调用的是哪个重载方法。

此外, template function 天然就支持更方便的传参方式,所以就更加没有必要像 java 那样实现,例如,你可在定义时只使用一个参数,例如:
#define layout(map)
#(map.title)
#(map.desc)
#end

传参的时候这样:
#@layout({title : "JFinal 极速开发社区" , desc: "天下武功,唯快不破"})
通过上面的方式,你可以传递任意类型,任意数量的参数进去


除了以上的方式传参以外,还可以通过 #set(...) 指令在模板中任意传参,例如:
#define layout()
#(title)
#(desc)
#end

用的时候这样:
#set(title = "JFinal", desc = "天下武功,唯快不破")
#@layout()
第二种方式相当于将参数从调用向前挪到了 #set 指令中

通过上面两种用法可以看出来,虽然 jfinal enjoy 引擎没有通过参数个数与参数类型进行函数重载,但传参可以更加自由灵活。

本质上是因为动态类型不方便通过参数的变数来实现重载

JFinal

2017-12-04 16:08

再补充一下,上面的所说的一切,仅仅针对于 #define 定义的 template function 而言,而表达式中调用 java 方法时,与 java 规则完全一样,例如:
#("abc".substring(1))
#("abc".substring(0, 2))
上面的 substring 方法调用的是 java 中的 String 类型的两个重载过的 substring 方法,这类调用是支持通过不同的参数个数、不同的参数类型,去调用不同的重载方法的

除了上面的调用 java 类上的方法以外,jfinal 的 shared object、shared method、extension method 这三种扩展全都支持方法重载