mustache.js實現首頁元件動態渲染
阿新 • • 發佈:2020-12-27
前言
在專案開發過程中,特別是OA類軟體,會針對郵件/待辦/公告等模組在主頁面進行快捷檢視的元件展示要求,類似效果如下
針對框架層面,我們可以進行後臺的視覺化配置,使用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>