phone-->im-->sys_message.html
在模板中执行对应的js,然后将过滤后的数据拿出来渲染:
<%
var dataObj = repeatMsg.showData(data);
for (var key in dataObj) {
%>
repeatMsg.showData(data)是主要的过滤方法。
var repeatMsg = (function(){
var repeatObj = {};
var dataMsg = [],dataMsgApp=[];
repeatObj.showData = function(data){
dataMsgApp=[];
var len = dataMsg.length
if(len==0 && data.length>0){
repeatObj.setDataMsg(data);
return dataMsg;
}else{
repeatObj.setDataMsg(data);
return dataMsgApp;
}
};
repeatObj.setDataMsg = function(data){
for(var i = 0; i< data.length;i++){
if(dataMsg.length == 0){
dataMsg.push(data[i]);
}else{
var temp = true;
for(var j = 0; j< dataMsg.length;j++){
var dataMsgkey = repeatObj.getDataKey(dataMsg[j]);
var datakey = repeatObj.getDataKey(data[i]);
if(dataMsgkey == datakey){
temp = false;
break;
}
}
if(temp){
dataMsg.push(data[i]);
dataMsgApp.push(data[i]);
}
}
}
};
repeatObj.getDataKey = function(data){
var type = data.extra.type;
if(type == 'ms-0002' || type == "ms-0003"){
var ms_extra_info = data.extra.ms_extra_info;
return ms_extra_info.im_group_id+"_"+ms_extra_info.user_code;
}
if(type == 'ms-0001'){
return data.extra.ms_extra_info.user_code;
}
if(type == 'ms-0006'){
return data.extra.group_id;
}
return "";
};
return repeatObj;
})();
以上代码的结构为var k = (function(){})(); 内部function的地位和k等价,所以在页面未关闭的情况下,function内部的变量的数据不会被初始化。
geiDataKey()方法返回的值为每个类型的唯一ID(与主键不同,因为每生成一条系统消息就会产生一个新的主键,但是内容却很可能是相同的。)
setDataMsg()方法是过滤的核心,它进行两层循环,第一层为基数,第二层的数据为过滤后的部分数据;然后将第一层的数据与第二层的数据进行对比,如果发现重复就跳出循环,并且不向dataMsg中添加数据,如果发现没有重复就向dataMsg中添加数据。
showData()方法是返回过滤后的数据,dataMsgApp是在页面未关闭的情况下渲染新加入的验证消息;dataMsgApp在方法执行的时候会被初始化,所以只会有当前发送过来的新的一条验证消息。然后将此验证消息与之前dataMsg中的所有验证消息用同样的方法进行对比。