弹层拉取数据的交互效果实现

最近有这么一个需求,根据所对应的省份,将相应的各省的数据读取出来,显示在弹层中,并且读取对应各省-市-区的初始状态,然后进行选中与取消操作后,将相应选中的数据再传给程序那边。

废话不多说,先上图~

弹层拉取数据的交互效果实现_第1张图片

比如点击山西省后,出现的效果如下:

弹层拉取数据的交互效果实现_第2张图片

点击确定后,提示说已经保存成功,并将数据带给后台.

程序设计思路如下:

1、采用dojo的AMD异步加载思路,按需加载

2、弹层用到了artDialog组件

3、记录各省的初始化状态 -> 点击省份 -> 弹层 -> 调用ajax加载数据进来(加载进来后保存该数据,当下次点击时就不用再重新加载),如果加载数据太多,则需要添加滚动条 -> 对弹层的内容进行选择和取消(交互)-> 点击确定后,保存当前的状态,以便初始化下次打开时的状态,同时将所选市-区的id传给后台.

4.组件源码:

define('my/datalayer-picker', ['dojo/_base/declare','bin/artDialog/jquery.artDialog'], function(declare) {
var dataPicker = declare(null, {
constructor: function(args) {
var self = this;

declare.safeMixin(this, args);
this.settings = $.extend({}, dataPicker.defaults, args);
this.$container = $(this.settings.containerSelector);
this.$selector = $(this.settings.dataSelector, this.$container);

this.dataUrl=this.settings.dataUrl;

this.data = {};
this.selectedData = [];
this.dataParam = {};

//记录各省的初始化状态
this.$selector.each(function(){
var flag=$(this).attr("flag");
if(flag==1){
$(this).addClass("selected");
}
})

this.$selector.on("click",function(){
self.dialog(this);
});
},

dialog: function(picker) {
var self = this;
var $picker = $(picker);
dataid = $picker.attr("dataid");
var dialogCfg = {
title: false,
lock: true,
fixed: true,
okValue: '确定',
ok: function() {
self.send();
},
cancelValue: '取消',
cancel: true
};

dialogCfg.content = 'loading...';
var dialogInst = $.dialog(dialogCfg);
$(dialogInst.dom.content).css({"width":"auto","height":"auto"});
//第一次弹层后保存省的数据
if (this.data.hasOwnProperty(dataid)) {
var data = this.data[dataid];
dialogInst.content(self.fetch(data));
dialogInst.title(data.name);

self.state();
self.interactive();
scrollbar();
} else {
$.getJSON(this.dataUrl, { dataid: dataid }, function(data) {
self.data[dataid] = data;
dialogInst.content(self.fetch(data));
dialogInst.title(data.name);

self.state();
self.interactive();
scrollbar();
});
}

function scrollbar(){
//弹层渲染数据后 & 拿到content的宽和高
/*console.log(dialogInst.dom.outer.context.clientWidth , dialogInst.dom.outer.context.clientWidth,
dialogInst.dom.content.context.clientWidth , dialogInst.dom.content.context.clientHeight); //779 808 777 716*/
$(dialogInst.dom.content).css({"height":"auto"});
//需要设置滚动条
//$(dialogInst.dom.outer).parent().css({"position":"absolute","left":"50"});
//console.log($(dialogInst.dom.outer).parent().position());
if(dialogInst.dom.outer.context.clientHeight > 300){
$(dialogInst.dom.content).css({"overflow-x":"hidden","overflow-y":"auto","width":"550","height":"150"});
}else{

}
}
},
//页面渲染
fetch: function(data) {
var self=this;
var html = [], cityData = data.city;
for (k in cityData) {
var cityHtml = ['<dl class=\"clearfix tag\">'];
var city = cityData[k];

//记录各市的初始化状态
if(city.flag==1){
self.selectedData.push(k);
city.flag=0;
}

cityHtml.push('<dt did="'+ k +'" class=\"selector-tag\"><a href=\"javascript:;\"><em>'+ city.name +'</em><i></i></a></dt>');

//判断市下面是否有区
if(city.area!=""){
var areaData = city.area;
for (var j = 0, l = areaData.length; j < l; j++) {
var area = areaData[j];

//记录各区的初始化状态
if(area.flag==1){
self.selectedData.push(area.id);
area.flag=0;
}

cityHtml.push('<dd did="'+ area.id +'" class=\"selector-tag\"><a href=\"javascript:;\"><em>'+ area.name +'</em><i></i></a></dd>');
}
}else{

}

cityHtml.push('</dl>');
html.push(cityHtml.join(''));
}
console.log(self.selectedData);
return html.join('');
},
//保存的状态样式
state: function(){
var self=this;
console.log(this.selectedData);
if(this.selectedData!=null){
for(var i=0 ; i < this.selectedData.length ; i++){
//各市-区的
$(".selector-tag").each(function(){
if(self.selectedData[i] == $(this).attr("did")){
$(this).children("a").addClass("selected");
}
})
}
}
},
//页面交互
interactive: function(){
//选择市-区域的联动处理
$("dd.selector-tag a").click(function(){
if($(this).hasClass("selected") && !$(this).parent().siblings("dd").children("a").hasClass("selected")){
$(this).removeClass("selected").parent().siblings("dt").children("a").removeClass("selected");
}else if($(this).hasClass("selected")){
$(this).removeClass("selected");
}else{
$(this).addClass("selected");
$(this).parent().siblings("dt").children("a").addClass("selected");
}
})
$("dt.selector-tag a").click(function(){
if($(this).hasClass("selected")){
$(this).removeClass("selected").parent().siblings("dd").children("a").removeClass("selected");
}else{
$(this).addClass("selected");
$(this).parent().siblings("dd").children("a").addClass("selected");
}
})

$("dl.tag:first").css({"background":"none","padding":"0"});
},
//发送数据
send: function(){
var self=this;
var $select=$(".selector-tag a").filter(".selected");
self.selectedData=[];
self.selectedData.push(dataid);
$select.each(function() {
var $arr = $(this).parent().attr("did");
self.selectedData.push($arr);
});
self.dataParam['val']=self.selectedData;
console.log(self.selectedData);
//加载tips
require(['my/tips'], function(Tips) {
self.tips = new Tips();
});

$.ajax({
type: "POST",
dataType:"json",
url: self.dataUrl,
data:self.dataParam,
cache:false,
beforeSend: function() {
self.tips.loading('正在保存中...');
},
success: function(ret) {
if (ret.error) {
self.tips.error({msgTitle:'保存失败',msgContent:ret.message});
} else {
self.tips.success({msgTitle:'保存成功',msgContent:null});

}
}
});
}
});
dataPicker.defaults = {
containerSelector: '#main', // 容器选择器
dataSelector: '[role="datapicker"]', // 所有弹层拉取数据的role
dataUrl : 'data.php?ref=region'
};
return dataPicker;
});

 

 

 

你可能感兴趣的:(数据)