Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
前端技术
正文
原创
2018-07-17
浏览 (
9195
)
Mustache模板技术
Mustache 是一款经典的前端模板引擎,在前后端分离的技术架构下面,前端模板引擎是一种可以被考虑的技术选型,随着重型框架(AngularJS、ReactJS、Vue)的流行,前端的模板技术已经成为了某种形式上的标配,Mustache 的价值在于其稳定和经典。 主页:https://github.com/janl/mustache.js/ 文档:https://mustache.github.io/mustache.5.html ### 一、简介 Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,通常是标准的 HTML 文档。当然不同的开发语言有不同模板引擎,如 Javascript 下的 Hogan 、ASP 下的 aspTemplate、以及 PHP 下的 Smarty,这里主要介绍基于 Javascript 语言的模板引擎,目前流行有 Mustache、Hogan、doT.js、JsRender、Kendo UI Templates等,jsperf.com 上可以看到它们的性能对比。 Mustache 是一个轻逻辑的模板语言( Logic-less templates),mustache 是一个js模板,用于展示和js分离,它的优势在于可以应用在 Javascript、PHP、Python、Perl 等多种编程语言中。原本是基于javascript 实现的模板引擎,类似于 freemark和valicity ,但是比freemark和valicity更加轻量级更加容易使用,经过拓展目前支持javascript,java,.NET,PHP,C++等多种 平台下开发! 项目首页:http://mustache.github.com/ 项目文档:http://mustache.github.com/mustache.5.html Demo: http://mustache.github.com/#demo ### 二、模板: 1)js模板可以是一个html文件 ``` <h1>Hello {{name}}, it is {{timeNow}}.</h1> ``` 2) js模板可以是一个值是html代码的js变量 ``` var template = "<p>Hello {{name}}, it is {{timeNow}}.</p>"; ``` 3) js模板可以是一个script片段 ``` <script id="tpl-greeting" type="text/html"> <dl> <dt>Name</dt> <dd>{{name}}</dd> <dt>Time</dt> <dd>{{timeNow}}</dd> </dl> </script> ``` mustache模板语言 1) 变量: 变量标记将当前上下文的变量通过模板渲染,如果当前上下文不存在该变量,则渲染为空串。 默认变量会被经过 HTML 编码处理,如需显示原始值,用三个大括号或者在模板标记的初始加入 & 符号。 {{变量名 }} ,{{{变量名 }}} 如果当前键为基本或对象,则渲染一次,如果为数组,则渲染数组长度次数。节点以 # 号开始,以 / 结束。 模板: ``` {{#stooges}}<b>{{name}}</b><br>{{/stooges}}" json: {"stooges":[{"name":"王升"},{"name":"梁文彦"},{"name":"石洋"}]}; ``` 2).填充数组节点以 # 号开始,以 / 结束,则渲染数组长度次数。 模板{{#数组}}{{数组内的key}}{{/数组}} ``` var template = "{{#stooges}}<b>{{name}}</b><br>{{/stooges}}";var view = {"stooges":[{"name":"王升"},{"name":"梁文彦"},{"name":"石洋"}]} ``` 3) .函数作为模板的变量,该函数会在当前列表的每一个元素的上下文迭代执行。 ``` var template = "{{#beatles}}* {{name}}<br/>{{/beatles}}"; var view = { "beatles": [ { "firstName": "John", "lastName": "Lennon" }, { "firstName": "Paul", "lastName": "McCartney" }, { "firstName": "George", "lastName": "Harrison" }, { "firstName": "Ringo", "lastName": "Starr" }], "name": function () { return this.firstName + " " + this.lastName;} }; ``` 如果节点键的值为函数,注意该函数在执行时的两个参数,第一个为该节点变量的直接值,第二个为函数,其执行的上下文对应视图对象 ``` var template = "{{#bold}}Hi {{name}} {{lastName}}.{{/bold}}"; var view = {"name": "John","lastName": "Lennon","bold": function () { return function (text, render) {return "<b>" + render(text) + "</b>";} }} ``` 4) mustache模板使用 模板变量在上下找模板变量需要的数据进行填充。json数据的key跟模板的变量对应就会填充。模板变量和json的key对应不上就不填充。生成展示代码没填充的变量不显示 用Mustache.render(template, view)方法填充数据生成展示代码 * view——为json数据,作为模板上下文 * template——为模板对象 ``` //模板 var template = "<p>Hello {{name}}, it is {{{ignore name}}}.it is {{&name}}</p>"; //数据 var date = new Date(); var view = {name: "<b>Jonny</b>",timeNow: date.getHours() + ':' + date.getMinutes() }; ``` 使用模板文件要用该方法填充数据生成展示代码 ``` $.get('模板文件', function(templates) { var template = $(templates).html(); $Mustache.render(template, view); }); ``` ### 三、Mustache 语法 Mustache 的模板语法很简单,就那么几个,用于HTML,配置文件,源代码等。它的工作方式是通过通过以哈希值或者对象的方式扩展模板标签。 * {{keyName}} * {{#keyName}} {{/keyName}} * {{^keyName}} {{/keyName}} * {{.}} * {{<partials}} * {{{keyName}}} * {{!comments}} * ``` <script type="text/javascript" src="mustache.js"></script> <script type="text/javascript"> var data = { "company": "Apple", "address": { "street": "1 Infinite Loop Cupertino</br>", "city": "California ", "state": "CA ", "zip": "95014 " }, "product": ["Macbook ","iPhone ","iPod ","iPad "] } var tpl = '<h1>Hello {{company}}</h1>'; var html = Mustache.render(tpl, data); console.log( html ) </script> //运行后 Console 输出: <h1>Hello Apple</h1> ``` 1. {{keyName}} {{}}就是 Mustache 的标示符,花括号里的 keyName 表示键名,这句的作用是直接输出与键名匹配的键值,例如: ``` var tpl = '{{company}}'; var html = Mustache.render(tpl, data); //输出: Apple ``` 2. {{#keyName}} {{/keyName}} 以#开始、以/结束表示区块,它会根据当前上下文中的键值来对区块进行一次或多次渲染,例如改写下 Demo 中的 tpl: ``` var tpl = '{{#address}} <p>{{street}},{{city}},{{state}}</p> {{/address}}'; var html = Mustache.render(tpl, data); //输出: <p>1 Infinite Loop Cupertino</br>,California,CA</p> ``` 注意:如果{{#keyName}} {{/keyName}}中的 keyName 值为 null, undefined, false;则不渲染输出任何内容。 3. {{^keyName}} {{/keyName}} 该语法与{{#keyName}} {{/keyName}}类似,不同在于它是当 keyName 值为 null, undefined, false 时才渲染输出该区块内容。 ``` var tpl = {{^nothing}}没找到 nothing 键名就会渲染这段{{/nothing}}; var html = Mustache.render(tpl, data); //输出: 没找到 nothing 键名就会渲染这段 ``` 4. {{.}} {{.}}表示枚举,可以循环输出整个数组,例如: ``` var tpl = '{{#product}} <p>{{.}}</p> {{/product}}'; var html = Mustache.render(tpl, data); //输出: <p>Macbook iPhone iPod iPad</p> ``` 5. {{>partials}} 以>开始表示子模块,如{{> address}};当结构比较复杂时,我们可以使用该语法将复杂的结构拆分成几个小的子模块,例如: ``` var tpl = "<h1>{{company}}</h1> <ul>{{>address}}</ul>" var partials = {address: "{{#address}}<li>{{street}}</li><li>{{city}}</li><li>{{state}}</li><li>{{zip}}</li>{{/address}}"} var html = Mustache.render(tpl, data, partials); //输出: <h1>Apple</h1> <ul><li>1 Infinite Loop Cupertino</br></li><li>California</li><li>CA</li><li>95014</li></ul> ``` 6. {{{keyName}}} {{keyName}}输出会将等特殊字符转译,如果想保持内容原样输出可以使用{{{}}},例如: ``` var tpl = '{{#address}} <p>{{{street}}}</p> {{/address}}' //输出: <p>1 Infinite Loop Cupertino</br></p> ``` 7. {{!comments}} !表示注释,注释后不会渲染输出任何内容。 ``` {{!这里是注释}} //输出: ``` ### 四、Mustache.java和Mustache.js开发 1. java开发参见https://github.com/spullara/mustache.java 2. js开发参见https://github.com/janl/mustache.js 参考: http://coenraets.org/blog/2011/12/tutorial-html-templates-with-mustache-js/ http://mustache.github.com/mustache.5.html http://ued.xinyou.com/2012/07/mustache_5_document.html https://blog.csdn.net/wangwenjun69/article/details/45971563 ----- > 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 > > RDIFramework.NET官方网站:[http://www.rdiframework.net/ ](http://www.rdiframework.net/) > > RDIFramework.NET官方博客:[http://blog.rdiframework.net/ ](http://blog.rdiframework.net/) > > 同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏! > > RDIFramework.NET框架由专业团队长期打造、一直在更新、一直在升级,请放心使用! > > 欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。 > 扫描二维码立即关注 ![](http://p9uaba3jv.bkt.clouddn.com/guosi-weixing.jpg)
正文到此结束
本文标签:
其他
Web前端
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
[推荐]ORACLE SQL:经典查询练手第五篇(不懂装懂,永世饭桶!)
下一篇
前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
.NET快速信息化系统开发框架 V3.2->Web版本模块管理界面新增模块排序功能
ORACLE常见问题一千问(提供下载)(不怕学不成、就怕心不诚!)
RDIFramework.NET—.NET快速开发整合框架【开发实例】之产品管理(MVC版)
Mustache模板技术
RDIFramework.NET敏捷开发框架 ━ 工作流程组件Web业务平台-3.6Ace版本
RDIFramework.NET平台代码生成器V3.1.6125.27586全新发布-更新于20161029(提供下载)
[推荐]ORACLE SQL:经典查询练手第二篇(不懂装懂,永世饭桶!)
RDIFramework.NET框架通过SignalR技术整合即时通讯(IM)
RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理
RDIFramework.NET V3.3 Web版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
后台界面设计之表单设计规范参考
.NET快速信息化系统开发框架 V3.2 -> “用户管理”主界面使用多表头展示、增加打印功能
RDIFramework.NET代码生成器全新V5.1版本发布
git用.gitignore忽略指定文件
RDIFramework.NET WinForm版新增报表管理功能模块
JavaScript初学者应知的24条最佳实践(译)
RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V2.9 版本震撼发布
ORACLE常见问题一千问[301至400](不怕学不成、就怕心不诚!)
全新跨平台版本.NET敏捷开发框架V5.0-RDIFramework.NET震撼发布
ORACLE常见问题一千问[801至900](不怕学不成、就怕心不诚!)
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127