jfinal模板中的模板继承问题

在文档中,我只找到了#define类似thinkphp中的block模板继承方法,但是有个疑惑,例如:这是子模板代码

#include("../Common/tpl.html")

#@layout()


#define content()

asdfasdf

#end

这样只是继承了tpl父模板,然后#define content()只是针对父模板中定义的#@content()位置下添加代码,我想要的效果就是能否重写父模板某些的html代码,可以有类似替换的效果,并非追加代码,请高手指点!

评论区

JFinal

2018-12-03 10:52

jfinal 模板没有继承功能,上述的 #include 功能,仅仅是将目标模板原样不动放在 #include 指令所在之处

而 #@layout() 是模板函数调用,#define content() 是模板函数定义,这里面只有极其简单的函数定义与调用,再也没有任何其它的概念

如果你希望实现类似于重写父类板的某些 html 代码,起码有如下两个方案:
1: 将被 #include 模板中的需要变化的部分使用变量开放出来,例如先用 htmlFragment做好埋点工作:
#if (htmlFragment)
#(htmlFragment)
#else
这里放上htmlFragment 不存在时的默认 html 内容
#end

然后,在主模板中为 htmlFragment 赋值即可:
#inlcue("_layout.html")
#set(htmlFragment = ....)
#@layout()

当然,这个 htmlFragment 内容比较多的时候,可以使用 #string 指令来做:
#string(htmlFragment)
这里放大量 html
#end

2: 第二个方法是在需要变动的地方放上模板函数的安全调用,例如:
#@htmlFragment?()
注意上面的函数名后方有个问号,就是说函数存在时才真正调用,不存在则跳过

由于 jfinal enjoy 的功能极为简洁强大,所以还有很多其它办法,例如自定义指令实现类似多态的功能等等,这种扩展是最彻底最直接的,看一下 Directive 抽象类中的注释,进行扩展即可

Aizen

2018-12-03 18:35

@JFinal 好的,感谢感谢

JFinal

2018-12-03 18:43

@Aizen 模板中要实现继承的功能并不难,但引来的学习成本以及复杂度是用户无法承受的

模板本质是在大量模式化的内容中输出点动态内容,不适宜搞得过于复杂,因为复杂场景是留给后端的

热门反馈

扫码入社