JFinal指令#()拼接问题

在前端使用#()的时候,遇到#()无法进行拼接,比如说我在ajax的回调函数里需要这样

content+="<input type='text'  name="+data[i].fieldName+" class='form-control'  value=#(j?j."+data[i].fieldName+":'')>"

在value这里,#()中拼接一个从后台返回的json数据data[i].fieldName

但是每次执行就会后台报错如下QQ图片20180809185717.png

不知道如何解决,求助一下。。。。。

ajax部分的代码

$.post(
        ctx+"/admin/im/getFormList", //url
	function(data){				
	    var content="";
	    for(var i =0;i<data.length;i++){
	    content+="<div class='form-group'>"
	    content+="<label class='col-md-2 control-label' for='demo-text-input'>"+data[i].label+"</label>"
	    content+="<div class='col-md-2'>"
	    //content+="<input type='text'  name="+data[i].fieldName+" class='form-control'  value=''>"
	    content+="<input type='text'  name="+data[i].fieldName+" class='form-control'  value=#(j?j.data[i].fieldName:'')>"
	    content+="</div>"
	    content+="</div>"
	    }
	    $("#editForm").prepend(content);					
	    },
	    "json" //数据格式
	);


评论区

杜福忠

2018-08-09 19:28

jfinal模版 是后端运行的模版

不在前端运行, 先搞清楚什么在前端运行, 哪些代码在后端运行. 不然全程懵逼状态.

报错的代码应该是这个: #(j?j."+data[i].fieldName+":'')
使用错误 , 建议先看下手册, 再使用jfinal模版 : http://www.jfinal.com/doc/6-4

以及你可能需要的是前端模版插件 : http://www.layui.com/doc/modules/laytpl.html

JFinal

2018-08-09 20:42

#(j?j."+data[i].fieldName+":'') 改成:
#(j ? j.data[i].fieldName : "")

总之,指令括号中的一切都是表达式,要按表达式的写法去走

Snake8859

2018-08-09 20:44

@杜福忠 恩恩,谢谢。我看了一下手册,这个指令好像没有说可以拼接 ,报错应该是我的格式出错了。但是这边因为要动态拼接对象名.属性,所以才想那样做,不知道JFinal模板引擎指令,能不能够做到从域中取出对象,然后动态拼接对象名.属性。

JFinal

2018-08-09 21:01

@Snake8859 可以拼接,例如:
#("abc" + "def" + 123)

Snake8859

2018-08-09 21:01

@JFinal 谢谢 ,我试了一下,还是不行,我把我完整的ajax的代码补上去了,因为我这边data[i].fieldName是参数里的,不能写在字符串里面。

Snake8859

2018-08-09 21:10

@JFinal 恩恩,这个拼接没问题。不过按照我代码里的拼接的方式话,会破坏了表达式的写法。不知道能不能够有其他解决办法。我想大概实现,像这里说的这样。
https://blog.csdn.net/zou493451860/article/details/79744702

杜福忠

2018-08-09 21:52

@Snake8859 jfinal模版代码在后端运行的!!!
JS 代码在前端运行的, 把他们分开运行, 思路大约在下, 自己调下

var jDataArr= null;
#if(j)
jDataArr=[
#for(x, j.data)
{x.fieldName},
#end
]
#end
$.post(
ctx+"/admin/im/getFormList", //url
function(data){
var content="";
for(var i =0;i<data.length;i++){
content+="<div class='form-group'>"
content+="<label class='col-md-2 control-label' for='demo-text-input'>"+data[i].label+"</label>"
content+="<div class='col-md-2'>"
//content+="<input type='text' name="+data[i].fieldName+" class='form-control' value=''>"
content+="<input type='text' name="+data[i].fieldName+" class='form-control' value='"+(jDataArr?jDataArr[i]:'')+"' >"
content+="</div>"
content+="</div>"
}
$("#editForm").prepend(content);
},
"json" //数据格式
);

受伤的蚂蚁

2018-08-09 23:10

@JFinal 遇到同样问题了,意思是这样,输出指令中的对象是动态拼接的,如果用#("data." + "name"),这样输出的是字符串 data.name,不是想要的#(data.name)中data对象的name值,不知道这样描述清楚不?不知道有什么别的办法渲染#(data.name)不?

JFinal

2018-08-09 23:28

@受伤的蚂蚁 也就是将拼接后的 String 当成表达式再次求值,这个需要你做下指令扩展,例如扩展个 #eval 指令出来,或者试着做一个 shared method 扩展

#eval 指令比较好做,将里头的参数再次当成表达式求值即可

shared method 扩展需要获取到 Scope 对象中的值,需要使用一个 ThreadLocal 传递 Scope 过去,这个比较麻烦

JFinal

2018-08-09 23:29

@受伤的蚂蚁 还有一个简单的办法,如果 data 是 map 类型的,可以用一下下面的表达式:
#(data[name]))

上面的用法,其中的 name 可以是动态的变量,但 data 这个是固定的一个变量名

受伤的蚂蚁

2018-08-09 23:56

@JFinal 谢谢波总这么晚回答,看了上边的帖子用map也是个办法,但后台需要转换,我暂时先加了vue结合输出指令用了

小葱x

2018-08-10 11:19

@JFinal 很管用 #(masterData['s_'+field.fieldValue]??)

Snake8859

2018-08-10 15:08

@杜福忠 感谢,感谢,我换了一个方式了,不写在ajax里面,直接在页面里加#for() #end,然后在这个for里面写一些逻辑就好了。我回头调试一下你的方式,十分感谢!

热门反馈

扫码入社