mustache.js實(shí)現(xiàn)首頁(yè)元件動(dòng)態(tài)渲染的示例代碼
前言
在項(xiàng)目開發(fā)過(guò)程中,特別是OA類軟件,會(huì)針對(duì)郵件/待辦/公告等模塊在主頁(yè)面進(jìn)行快捷查看的元件展示要求,類似效果如下
針對(duì)框架層面,我們可以進(jìn)行后臺(tái)的可視化配置,使用mustache.js在主頁(yè)面進(jìn)行動(dòng)態(tài)渲染,避免了對(duì)主頁(yè)面的繁瑣的硬編碼工作,同時(shí)針對(duì)每個(gè)信息展示的元件進(jìn)行內(nèi)部個(gè)性化處理
表結(jié)構(gòu)
包含了元件名稱,元件模板路徑,元件列表數(shù)據(jù)路由,查看更多路由,啟用/禁用等
可視化配置
模板定義
這里的模板直接使用的html文件,方便css與js的修改,簡(jiǎn)單的使用了mustache.js進(jìn)行模板數(shù)據(jù)綁定,當(dāng)然也可以使用其他模板引擎
<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>
主頁(yè)面模板渲染
主要是針對(duì)當(dāng)前配置的模板進(jìn)行分組,渲染每行每列的元件,模板文字內(nèi)容在后端處理獲取完成,前端調(diào)用Mustache.render方法進(jìn)行數(shù)據(jù)的填充,同時(shí)需要注意針對(duì)每個(gè)元件定義局部刷新的方法,避免操作完畢后針對(duì)主頁(yè)面整體刷新
<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 } //刷新事件存儲(chǔ) pageData.ElementList[index]["RefreshEvent"] = function () { //請(qǐng)求數(shù)據(jù) 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); } }) } //請(qǐng)求數(shù)據(jù) CommonRefresh(id); } } } else { OpenFail(res.data) } }) } function CommonRefresh(id) { $(pageData.ElementList).each(function () { if (this.ElementID == id) { this.RefreshEvent(); } }) } </script> </body>
到此這篇關(guān)于mustache.js實(shí)現(xiàn)首頁(yè)元件動(dòng)態(tài)渲染的文章就介紹到這了,更多相關(guān)mustache.js首頁(yè)元件動(dòng)態(tài)渲染內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
瀏覽器兼容console對(duì)象的簡(jiǎn)要解決方案分享
不同瀏覽器或者版本之間對(duì)于console對(duì)象的支持不盡相同,而console方法在開發(fā)調(diào)試過(guò)程中都是不錯(cuò)的工具。難道要在上線前把所有console.xxxx去掉以保證某些瀏覽器不報(bào)錯(cuò)么。其實(shí)可以變通解決2013-10-10JavaScript解決浮點(diǎn)數(shù)計(jì)算不準(zhǔn)確問(wèn)題的方法分析
這篇文章主要介紹了JavaScript解決浮點(diǎn)數(shù)計(jì)算不準(zhǔn)確問(wèn)題的方法,結(jié)合實(shí)例形式分析了javascript浮點(diǎn)數(shù)運(yùn)算精度誤差的原因以及相關(guān)的解決方法與具體操作技巧,需要的朋友可以參考下2018-07-07基于JS實(shí)現(xiàn)計(jì)算24點(diǎn)算法代碼實(shí)例解析
這篇文章主要介紹了基于JS實(shí)現(xiàn)計(jì)算24點(diǎn)算法代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07JavaScript運(yùn)行過(guò)程中的“預(yù)編譯階段”和“執(zhí)行階段”
這篇文章主要介紹了JavaScript運(yùn)行過(guò)程中的“預(yù)編譯階段”和“執(zhí)行階段”的相關(guān)資料,需要的朋友可以參考下2015-12-12Javascript控制頁(yè)面鏈接在新窗口打開具體方法
今天看一個(gè)朋友說(shuō)不在A標(biāo)題中加打開窗口形式要怎么讓頁(yè)面中所有頁(yè)面在新頁(yè)面打開,后來(lái)我找了幾種比較實(shí)用辦法,個(gè)人最喜歡的是最后一種方法哦2013-08-08Javascript將string類型轉(zhuǎn)換int類型
今天網(wǎng)站有個(gè)小功能要判斷用戶購(gòu)買商品數(shù)量是否大于庫(kù)存數(shù)據(jù),如果大于庫(kù)存數(shù)量,就給予提示。2010-12-12