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

前言

在项目开发过程中,特别是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>
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容