mustache.js实现首页元件动态渲染的示例代码


Posted in Javascript onDecember 28, 2020

前言

在项目开发过程中,特别是OA类软件,会针对邮件/待办/公告等模块在主页面进行快捷查看的元件展示要求,类似效果如下

mustache.js实现首页元件动态渲染的示例代码

针对框架层面,我们可以进行后台的可视化配置,使用mustache.js在主页面进行动态渲染,避免了对主页面的繁琐的硬编码工作,同时针对每个信息展示的元件进行内部个性化处理

表结构

mustache.js实现首页元件动态渲染的示例代码

包含了元件名称,元件模板路径,元件列表数据路由,查看更多路由,启用/禁用等

可视化配置

mustache.js实现首页元件动态渲染的示例代码

mustache.js实现首页元件动态渲染的示例代码

模板定义

这里的模板直接使用的html文件,方便css与js的修改,简单的使用了mustache.js进行模板数据绑定,当然也可以使用其他模板引擎

<div class="cellheadcontainer">
 <span class="celltitletext">{{elementtitle}}</span>
 <div class="celltitleop">
  <a style="color:white" class="morebtn" onclick="OpenMore('{{elementmoreurl}}')">更多</a>
 </div>
</div>
<div class="cellcontentcontainer">
 {{#data}}
 <div class="notciecell" onclick="OpenDetail('{{title}}')">
  <div class="noticeleft">
   <span class="noticetitle noticeindex">{{index}}</span>
   <span class="noticetitle">{{title}}</span>
  </div>
  <div class="noticeright">
   <span class="noticetip">{{publishuname}}</span> 
   <span class="noticetip">{{publishdate}}</span>
  </div>
 </div>
 {{/data}}
</div>
<script>
 var noticeid = "{{elementid}}";
 function OpenMore(url) {
  OpenTopDialog( '消息通知列表', url, 600, 800, BindNotcieList)
 }
 function BindNotcieList() {
  CommonRefresh(noticeid);
 }
 function OpenDetail(title) {
  OpenTopDialog('消息详情', "frame/demo/notice/noticeDetail", 600, 800, BindNotcieList, title)
 }
</script>

主页面模板渲染

主要是针对当前配置的模板进行分组,渲染每行每列的元件,模板文字内容在后端处理获取完成,前端调用Mustache.render方法进行数据的填充,同时需要注意针对每个元件定义局部刷新的方法,避免操作完毕后针对主页面整体刷新

<body>
 <div id="app">
  <div id="maincontainer">
   <div class="rowcontainer">
    <div class="columncontainer">

    </div>
   </div>
  </div>
 </div>
 <script>
  loadcss(getRootPath() + "theme/" + GetSystemTheme() + "/main.css", true)
 </script>
 <script>
  var pageData = {
   ElementList: [],
   groupCount: 0,
   rowElementCount: 2
  };
  $(function () {
   BindElement();
  })

  function BindElement() {
   var param = {};
   CloudPost(param, GetRootPath() + "frame/extend/element/findMainPageElementList", function (res) {
    if (res.code == 0) {
     pageData.ElementList = res.data;
     var rowelementcount = pageData.rowElementCount
     var groupcount = pageData.ElementList.length % rowelementcount == 0 ? pageData
      .ElementList
      .length / rowelementcount : (parseInt(pageData.ElementList.length /
       rowelementcount)) +
      1;
     pageData.groupCount = groupcount;
     var MainHtml = "";
     for (var i = 0; i < groupcount; i++) {
      var RowHtml = " <div class='rowcontainer'>";
      for (var j = 0; j < rowelementcount && i * groupcount + j < pageData.ElementList.length; j++) {
       var id = "row_" + (i + 1) + "column_" + (j + 1);
       var ColumnHtml = "<div class='columncontainer' id='" + id + "'>"
       ColumnHtml += "</div>"
       RowHtml += ColumnHtml;
      }
      RowHtml += "</div>";
      MainHtml += RowHtml;
     }
     $("#maincontainer").html(MainHtml);

     for (var i = 0; i < groupcount; i++) {
      for (var j = 0; j < rowelementcount && i * groupcount + j < pageData.ElementList.length; j++) {
       var index = i * rowelementcount + j
       var element = pageData.ElementList[index];
       var id = "row_" + (i + 1) + "column_" + (j + 1);
       pageData.ElementList[index]["ElementID"] = id;
       var renderdata = {
        elementtitle: element.ElementName,
        elementmoreurl: element.ElementMoreUrl,
        elementid: id
       }
       //刷新事件存储

       pageData.ElementList[index]["RefreshEvent"] = function () {
        //请求数据
        CloudPost({}, GetRootPath() + element.ElementDataUrl,
         function (res) {
          if (res.code == 0) {
           //合并json
           for (var attr in res) {
            renderdata[attr] = res[attr];
           }
           var htmlcontent = Mustache.render(element.TemplatContent, renderdata);
           $("#" + id).html(htmlcontent);
          }
         })
       }
       //请求数据
       CommonRefresh(id);
      }
     }
    } else {
     OpenFail(res.data)
    }
   })
  }

  function CommonRefresh(id) {
   $(pageData.ElementList).each(function () {
    if (this.ElementID == id) {
     this.RefreshEvent();
    }
   })
  }
 </script>

</body>

到此这篇关于mustache.js实现首页元件动态渲染的文章就介绍到这了,更多相关mustache.js首页元件动态渲染内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery读取和设定KindEditor值的方法
Nov 22 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
js读写json文件实例代码
Oct 21 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
js实现简单的省市县三级联动效果实例
Feb 18 Javascript
JS中innerHTML和pasteHTML的区别实例分析
Jun 22 Javascript
javascript学习之json入门
Dec 22 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
vue实现移动端图片裁剪上传功能
Aug 18 Javascript
浅谈Node Inspector 代理实现
Oct 19 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
js实现提交前对列表数据的增删改查
Jan 16 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 #Javascript
vue中watch的用法汇总
Dec 28 #Vue.js
浅析vue中的nextTick
Dec 28 #Vue.js
js仿淘宝放大镜效果
Dec 28 #Javascript
JavaScript实现原型封装轮播图
Dec 27 #Javascript
JavaScript代码实现简单计算器
Dec 27 #Javascript
JavaScript实现雪花飘落效果
Dec 27 #Javascript
You might like
队列在编程中的实际应用(php)
2010/09/04 PHP
smarty内置函数section的用法
2015/01/22 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
PHP中phar包的使用教程
2017/06/14 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python不同系统中打开方法
2020/06/23 Python
Python自省及反射原理实例详解
2020/07/06 Python
党校自我鉴定范文
2013/10/02 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
小学教师培训感言
2014/02/11 职场文书
英文演讲稿
2014/05/15 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
环境建议书
2015/02/04 职场文书
支教个人总结
2015/03/04 职场文书
详解SQL报错盲注
2022/07/23 SQL Server