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操作cookie_获取与修改代码
May 21 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
火狐textarea输入法的bug的触发及解决
Jul 24 Javascript
面向对象设计模式的核心法则
Nov 10 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
Feb 22 Javascript
Bootstrap实现默认导航栏效果
Sep 21 Javascript
jquery 遍历数组 each 方法详解
May 25 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
vue input输入框模糊查询的示例代码
May 22 Javascript
详解关于Vuex的action传入多个参数的问题
Feb 22 Javascript
比较node.js和Deno
Apr 27 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常用函数汇总
2014/12/17 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
澳大利亚商务邀请函
2014/01/17 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
楚门的世界观后感
2015/06/03 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
MySQL的安装与配置详细教程
2021/06/26 MySQL
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
Java基础-封装和继承
2021/07/02 Java/Android