关于jfinal的enjoy模板引擎跟layui模板引擎语法冲突的问题

  1. enjoy模板引擎一般用法:#xxx

  2. layui模板引擎一般用法:

    {{#  function(xxx){  }}

    ......

    {{#  };  }}



有个非常尴尬的地方,前端如果用了layui的模板引擎功能,于是上述写法的html在后台响应阶段,会触发enjoy引擎的渲染,导致报错。

有没有方法可以使enjoy引擎不识别#(空格)xxx,只识别#(不带空格)xxx?


现在我们的临时处理方法是layui用模板的部分套一个enjoy的注释语句。。非常吐血:

#[[{{#]]#  function(xxx){ }}

......

#[[{{#]]#  }; }}



评论区

pizi2019

2019-07-23 16:57

你可以自行修改 com.jfinal.template.stat.Lexer.java 这个类,这是语法解析器,你可以按照自己的意愿修改。

琴海森林

2019-07-23 18:06

最简单的就是这样,你可以写在外面:
#[[
{{# function(xxx){ }}

......

{{# }; }}
]]#
这样看着舒服一点

zeroabc

2019-07-23 18:06

@pizi2019 不是应该是官方兼容,或者官方出解决方案吗

zeroabc

2019-07-23 18:07

@琴海森林 问题是layui模板体内有可能要用到enjoy的一些处理,比如放动态参数等等

杜福忠

2019-07-23 18:18

还有很多解决方案是 #("#") 这样输出。
还有,JS 中初始参数, 应该使用 变量声明 比如在 var initData ={a: '#(a)', b: '#(b)' } #[[ 继续你的JS 操作 如需取值 initData.a 这样, 好处很多。
其次layui的模板是支持 自定义 # 的你喜欢的话,可以换成 {{@ xx }}

happyboy

2019-07-24 09:19

官方本身就兼容,参考文档:https://www.jfinal.com/doc/6-6。波总是这么说的:这非常有利于解决与前端javascript模板引擎的指令冲突问题。

zeroabc

2019-07-24 10:57

@happyboy
#[[{{#]]# function(xxx){ }}
......
#[[{{#]]# }; }}

zeroabc

2019-07-24 10:59

@杜福忠 https://www.layui.com/doc/modules/laytpl.html#delimiters
冲突的是#号符,而不是{{ }}

zeroabc

2019-07-24 11:37

@杜福忠 看了你的话,想到把lay模板的语句封装成方法或许看起看没有那么糟心

#define laytplStart(str)
#[[{{#]]# #(str??) }}
#end

#define laytplEnd(str)
#[[{{#]]# #(str??) }}
#end

zeroabc

2019-07-24 11:57


#define laytplStart(keyword,str)
{{#(keyword??) #(str??) }}
#end

#define laytplEnd(keyword,str)
{{#(keyword??) #(str??) }}
#end

#define laytplJsStart(str)
#@laytplStart("#",str)
#end

#define laytplJsEnd(str)
#@laytplEnd("#",str)
#end

完美,打扰了两位大佬 @琴海森林 @JFinal

杜福忠

2019-07-24 13:47

@zeroabc 是的, 想起来了, 我修改了jstpl的源码 里面# 换成了@ , 但是后来发现很多坑, 其他同事参与项目后, 有点分不清,什么是Java的 tpl 什么是 JS 的tpl , 乱的不行, 后来就统一让把 JS 独立成文件, 如果有 固定参数, 就使用 页面 JS 声明, 比如:var initData ={a: '#(a)', b: '#(b)' } 这样子, 再后来的项目, 我们就完全分离了, 有什么参数是后台不能穿过来的。。。