最近在用LayUI框架的时候有这样一个需求:点击answer.html的【查看评论】按钮的时候,用layer.open()打开一个子页面,里面contant的是一个html页面(comments.html),其中这个页面里展示的是该回答的评论内容。
点击【查看评论】按钮的时候,将表单中的【回答ID】的值传给表单中的子页面,然后在子页面中用ajax把这个ID值传给后台,查询评论内容,在子页面中进行展示。这里涉及到一个简单的问题:如何在点击按钮的时候,把表单中ID值传给子页面呢?
表单定义如下,具体的每一个参数都在官方文档中有,不懂的可以去查一下:
table.render({
elem: '#test'
,id:"AnswerReload"
,title: '回答情况表'
,where: {
question_id: question_id,//请求参数
}
,method: 'post'//请求方式
,contentType: "application/json;charset=utf-8"//传输的数据格式
,url: 'http://192.168.*.*:8000/answer_post/'//数据接口
,toolbar: '#toolbarDemo'
,defaultToolbar: ['filter', 'exports', 'print']
,jump: function(obj){
console.log(obj)
}
,cols: [[
{type: 'checkbox', fixed: 'left',width:50}
,{field:'id', title:'回答ID',align:'center', width:85, fixed: 'left', unresize: true,id:'answer_id'}
,{field:'author', title:'作者',align:'center', width:80,templet:'#author_link'}
,{field:'created_time', title:'创建时间', align:'center',width:110, sort: true,}
,{fixed: 'right', title:'操作', align:'center',toolbar: '#barDemo'}
]]
});
这是我定义的button按钮,这个id值就是表单中的toolbar的值:
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="comments">查看评论</a>
</script>
这里是对表格中的事件设置的监听。
table.on('tool(test)', function(obj){//test是原始表单中的lay-filter的值,obj是表单中改行的元素
var data = obj.data;
console.log(obj.data)
if(obj.event === 'comments'){
answer_id = data.id;//就是表单中这一行的id值,也就是要传给子页面的数据。
layer.open({
type: 2,//如果要打开一个html页面的话,这个type值就是2.如果要打开一个文本,这个值就是1.
title:'评论详情',
area:['400px','500px'],
content: 'comments_show.html',//要打开的子页面
async:false,
loading:true,
closeBtn: 1,
}
);
}});
如何在layer.open中把这个id值传给子页面??我在网上查了以后,尝试用body.find()方法传递,而且大部分回答都是比较麻烦,对于新手比较难理解。我把我的解决方法写出来,希望给新手们提供一点帮助,少走一些弯路。
一个更简单的方法就是:在父页面中定义一个全局变量,然后在子页面中用parent.answer_id就可以获取这个值了。相当于父子页面共享同一个参数。layer.open()中可以不另外设置。代码如下:
父页面中(answer.html)中:
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="comments">查看评论</a>
</script>
<script>
var answer_id;//全局变量,用来记录每一个id值,划重点!!!关键!!!
layui.use(['table','layer','form','laypage','rate'], function(){
var table = layui.table,
layer = layui.layer;
table.render({
elem: '#test'
,id:"AnswerReload"
,title: '回答情况表'
,where: {
question_id: question_id,//请求参数
}
,method: 'post'//请求方式
,contentType: "application/json;charset=utf-8"//传输的数据格式
,url: 'http://192.168.*.*:8000/answer_post/'//后台数据接口
,toolbar: '#toolbarDemo'
,defaultToolbar: ['filter', 'exports', 'print']
,jump: function(obj){
console.log(obj) }
,cols: [[
{type: 'checkbox', fixed: 'left',width:50}
,{field:'id', title:'回答ID',align:'center', width:85, fixed: 'left', unresize: true,id:'answer_id'}
,{field:'author', title:'作者',align:'center', width:80,templet:'#author_link'}
,{field:'created_time', title:'创建时间', align:'center',width:110, sort: true,}
,{fixed: 'right', title:'操作', align:'center',toolbar: '#barDemo'}
]]
});
//监听点击按钮事件,test是原始表单中lay-filter的值
table.on('tool(test)', function(obj){//test是原始表单中的lay-filter的值,obj是表单中改行的元素
var data = obj.data;//获取表单中的点击按钮的那一行数据
console.log(obj.data)
if(obj.event === 'comments'){
answer_id = data.id;//就是表单中这一行的id值,也就是要传给子页面的数据。
layer.open({//这里可以不写success
type: 2,//如果要打开一个html页面的话,这个type值就是2.如果要打开一个文本,这个值就是1.
title:'评论详情',
area:['400px','500px'],
content: 'comments_show.html',//要打开的子页面
async:false,
loading:true,
closeBtn: 1,
}
);
}});
</script>
子页面(comments.html)页面:
<script>
var answer_id = parent.answer_id;//这样是不是很简单?用parent就可以直接获取父页面的全局变量了。
//接下来,就是利用ajax传值了,或者其他的操作都可以!!
</script>
结束!!!!