jfinal 模板 中多include重名define函数名的问题

jfinal的模板中可以让我代码组件化,我看了club的代码一般波总的格式是layout里套main,然后main里面有js和css的define,layout中去@js?()

但是我是这样一个结构

image.png

我control1,2,3的html组件模板中都定义了同样的一个define js之后模板会报错

Template function "js" already defined

这样的解决方法是什么,是每一个control中的js我命名的时候得取专用名称比如ctlJs1,ctlJs2这样吗,还有有更好的解决方案,比如命名空间这种的?

评论区

JFinal

2017-07-27 20:48

你给出的结构图其实并不贴切,jfinal club 用于实现 layout 功能的方法,在本质上就是简单的函数调用:
1:#define layout() 定义 layout() 函数
2:layout() 函数中分别调用了 main() js() css() 这三个函数
3:定义 layout() 函数的模板文件通过 addSharedFunction(...) 将其置为共享函数,你可以认为是在最终的页面用 #include("__layout.html") 包含进来了而已
4:最终页面先是调用了 layout() 函数,然后 layout() 会调用 main()、js()、css(),而这三个函数在最终页面通过 #define 定义出来即可

简单来说:
1:最终页面,例如 index.html 是程序入口
2:在程序入口调用了 layout()
3:layout() 调用了定义在本页面定义的 main() js() css()

由于函数/方法几乎是所有程序语言中都有的现成的概念,所以理解起来非常符合直觉

JFinal

2017-07-27 20:51

再回到你的问题,模板文件只有一个入口文件,也就是 render(...) 方法中的参数所指向的那个模板文件,而一个模板文件没有太多必要搞出方法重载这类功能。所以 jfinal 模板引擎并不支持函数同名

解决方法可以是利用 #render 指令,为其传入动态的模板参数,实现模板的组合,这些个模板中定义的函数可以是同名的, #render 指令所处理的模板文件中的
#define xxx() 函数名是可以重名的,她们拥有各自的作用域

JFinal

2017-07-27 20:53

具体到你的场景,可以将 controller1 controller2 controller3 这三个块分别用一个简单的模板承载,例如:temp1.htm、temp2.html、temp3.html,然后在这三个模板文件中可以定义同名的模板函数,例如都定义一个 #define main() 出来

热门反馈

扫码入社