enjoy 怎么实现类似 freemarker nested macro嵌套功能

image.png

想实现的效果, 就是上图红框中的内容被封装成如下query函数

image.png

就是希望enjoy可以提供函数插槽的功能

评论区

JFinal

2019-06-07 17:47

先不说 #define 与模板函数安全调用可以解决你的问题,连最为灵活、动态的 #call 指令都给你了,还有啥 nested 是不能实现的:
#define myList(funcName, map)
#for(...)
#if(...)

#call(funcName, map)

#end
#end
#end

#define myFunc(user)
#(user.id)
#(user.name)
#end

// 动态传入被调用函数 myFun
#@myList("myFunc", {user : {id : 123, name : "james"} } )

Sohnny

2019-06-07 20:33

@JFinal 我写个enjoy对比freemarker的样例, 感觉还是freemarker的简单点, 不知道enjoy还有没有什么更好的写法。http://sojpt.com/template/file/25

JFinal

2019-06-08 09:47

@Sohnny 目前你的 freemareker实现只是少了一行代码,但enjoy 的用法可以传递参数,还可以改变被回调的函数名,而 freemarker 是定死的

再者 enjoy 的用法是函数定义与调用的逻辑,而 freemarker 的 nested 的用法很古怪,新手很难理解

最后,如果你一定要用 enjoy 实现目前 freemarker 的用法用下指令扩展即可,假定你定义了一个 #query 指令,用法如下:
#query(paras)
#(r.COLUMN_COMMENT.name)
#end

记得搞定后回来分享,自定义指令的方法最符合你的预期

Sohnny

2019-06-08 14:39

@JFinal 首先freemarker 也是可以传参的,其次nested我个人认为不古怪,因为它是一个插槽的概念,例如前端vue,就有slot的概念。 我的soutils对于用户只能通过模板扩展,希望enjoy后续可以提供插槽的概念的用法,毕竟enjoy不单单是集成在jfinal web中用的技术,其他基于它的一些工具软件可能后续推广开来还有类似的需求。

Sohnny

2019-06-08 15:00

@JFinal 还想到一个,例如enjoy在页面中调用子页的js或css,必须得先调用函数,就例如club项目中的 #@layout,在页面中调用函数,让人感觉回到了jsp,所以强烈建议引入插槽的概念,更容易被人理解。

JFinal

2019-06-08 16:10

@Sohnny 你再试一下 freemarker 的 nested ,实现 jfinal club 中的对于额外 css、js 添加的功能,而且这个功能是可选添加,用户可添可不添

也就是 jfinal club 中的下面用法:
#@js?()
#@css?()

你会发现 freemarker 的 nested 作为一个 slot 功能,只能插入一个东东, 并且必须要插入这个东东

enjoy 的函数调用可以不限数量,也可以选择不插入

再一个, FM 的 nested 部分本身无法带参,而 enjoy 的指令被调用的函数与主调函数都可以带参,这个与 nested 区别是很大的

JFinal

2019-06-08 20:28

@Sohnny slot 的用法可被 #define + #call 消解掉,或许有同学习惯了 freemarker 的 nested 用法,现给出其 enjoy 扩展实现:
https://www.jfinal.com/share/1650

Sohnny

2019-06-08 22:35

热门反馈

扫码入社