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 相关文章推荐
Javascript获取当前日期的农历日期代码
Oct 08 Javascript
jQuery链使用指南
Jan 20 Javascript
javascript将数字转换整数金额大写的方法
Jan 27 Javascript
浅谈js基本数据类型和typeof
Aug 09 Javascript
vue实现在表格里,取每行的id的方法
Mar 09 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 Javascript
详解基于Node.js的HTTP/2 Server实践
May 31 Javascript
Angular6 用户自定义标签开发的实现方法
Jan 08 Javascript
jquery登录的异步验证操作示例
May 09 jQuery
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 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
wordpress之wp-settings.php
2007/08/17 PHP
php下载远程文件类(支持断点续传)
2008/11/14 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
python实现隐马尔科夫模型HMM
2018/03/25 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
Python如何将字符串转换为日期
2020/07/31 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
python PIL模块的基本使用
2020/09/29 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
中学生爱国演讲稿
2013/12/31 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
服务员岗位责任制
2014/02/11 职场文书
大学生先进事迹材料
2014/02/16 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
个人自查自纠材料
2014/10/14 职场文书
golang日志包logger的用法详解
2021/05/05 Golang