在web前端开发,特别是富ajax应用,经常会出现前端大段大段拼接html的片段,这使得本事很简单的渲染逻辑变得很难维护也很难阅读。为了解决这一问题,借鉴目前比较流行的模版语言的思想,jstemplate作为这方面比较流行的解决方案值得学习。自己在学习的过程中,将官方的文档做一简单整理,翻译给大家。
一.helloworld(完整例子)
1)模版文件
<div id="t1">
<h1 jscontent="title"></h1>
<ul>
<li jscontent="$this" jsselect="favs"></li>
</ul>
</div>
2)填充数据
var favdata = {
title: 'Favorite Things',
favs: ['raindrops', 'whiskers', 'mittens']
};
3)添加js库
<script src="util.js" type="text/javascript"></script>
<script src="jsevalcontext.js" type="text/javascript"></script>
<script src="jstemplate.js" type="text/javascript"></script>
4)调用
function showData(data) {
// This is the javascript code that processes the template:
var input = new JsEvalContext(data); //初始化数据
var output = document.getElementById('t1'); //输出模版
jstProcess(input, output);
}
当showdata调用后,模版渲染完毕产生的html即:
<div jstcache="0" id="t1">
<h1 jstcache="1" jscontent="title">Favorite Things</h1>
<ul jstcache="0">
<li jsinstance="0" jstcache="2" jsselect="favs"
jscontent="$this">raindrops</li>
<li jsinstance="1" jstcache="3" jsselect="favs"
jscontent="$this">whiskers</li>
<li jsinstance="2" jstcache="4" jsselect="favs"
jscontent="$this">mittens</li>
</ul>
</div>
二.有用属性标签和概念解释
上面已经对jstemplate做了一个简单的应用,然而要真的理解它,并使用其高级点应用,需要了解一下一些概念。
1. 处理环境(processing
environment)[ 03-environ.html ]
有几个变量需要注意:
-
JsEvalContext
像其他context一样,它在整个代码执行过程中存在,存放所有的上下文数据,可以是字符串也可以json数据,一切你感兴趣的和有用的数据。
var mydata = {dataProperty: 'Nonny'};
var context = new JsEvalContext(mydata);
context.setVariable('declaredVar', 'Ho');
this即为模版定义的html的某个节点,而$this是该节点绑定的context的数据。如
<div id="witha">
<div id="Hey" jscontent="this.parentNode.id + this.id +
dataProperty + $this.dataProperty + declaredVar"></div>
</div>
这里this即为Hey div。而$this为context。
2.jscontent
<div id="tpl">
<span jsselect="username" jscontent="$this"></span>'s Address Book
</div>
即将该属性所在的节点值替换成jscontent的属性值。
3.jsselect
jsselect可以生成一个基于原context的新context。对于数组的数据,它能够自动遍历所有的元素并执行处理。
语言有点抽象,举个例子:
假如context值为:
var tplData = {
username:"Jane User",
addresses:[
{location:"111 8th Av.", label:"NYC front door"},
{location:"76 9th Av.", label:"NYC back door"},
{location:"Mountain View", label:"Mothership"}
]};
模版为:
<div id="tpl">
<span jsselect="username" jscontent="$this"></span>'s Address Book
</div>
由于jsselect 的先于其他的属性执行(除transclude),所以新的该节点绑定的contex为字符串:Jane User,故渲染完成后为:
<span jscontent="username" jstcache="1">Jane Userff</span>
这里可以看出,实际上和模版为:
<span jscontent="username"></span>'s Address Book
的一样。
因此,此标签更多用在数组上。
<table cellpadding="5">
<tr><td><h2>Location:</h2></td><td><h2>Label:</h2></td></tr>
<tr jsselect="addresses"><td jscontent="location"></td><td jscontent="label"></td></tr>
</table>
当处理器执行jsselect时,由于addresses是个数组,所以会遍历产生3个context,渲染的结果即:
<tr jsselect="addresses" jstcache="2" jsinstance="0">
<td jscontent="location" jstcache="3">111 8th Av.</td>
<td jscontent="label" jstcache="4">NYC front door</td>
</tr>
<tr jsselect="addresses" jstcache="2" jsinstance="1">
<td jscontent="location" jstcache="3">76 9th Av.</td>
<td jscontent="label" jstcache="4">NYC back door</td>
</tr>
<tr jsselect="addresses" jstcache="2" jsinstance="*2">
<td jscontent="location" jstcache="3">Mountain View</td>
<td jscontent="label" jstcache="4">Mothership</td>
</tr>
4.jsdisplay [ 06-jsdisplay.html, 07-jsdisplay-empty.html ]
此属性的值如果非0,true,非""时条件成立,将该节点的css属性display设置为none。对于设置块的动态隐藏有奇效。
5.transclude
[ 08-transclude.html ]
对于嵌套的数据结构,对于模版来讲,嵌套深度并不能知晓,深度是由数据控制的,为了能够方便写出此类场景的模版,引入了该属性。例:
<html>
<head><title>Outline Tree Using Jstemplates</title>
<script src="../util.js" type="text/javascript"></script>
<script src="../jsevalcontext.js" type="text/javascript"></script>
<script src="../jstemplate.js" type="text/javascript"></script>
<script type="text/javascript">
// Hierarchical data:
var tplData =
{ title: "Jstemplates", items: [
{ title: "Using Jstemplates", items: [
{ title: "The Jstemplates Module"},
{ title: "Javascript Data"},
{ title: "Template HTML"},
{ title: "Processing Templates with Javascript Statements"}
]
},
{ title: "Template Processing Instructions", items: [
{ title: "Processing Environment" },
{ title: "Instruction Attributes", items: [
{title: "jscontent"}, {title: "jsselect"}, {title: "jsdisplay"},
{title: "transclude"},{title: "jsvalues"}, {title: "jsskip"}, {title: "jseval"}
]}
]}
]};
var PEG_NAME = 'peg';
var TEMPLATE_NAME = 'tpl';
// Called by the body onload handler:
function jsinit() {
pegElement = domGetElementById(document, PEG_NAME);
loadData(pegElement, TEMPLATE_NAME, tplData);
}
function loadData(peg, templateId, data) {
// Get a copy of the template:
var templateToProcess = jstGetTemplate(templateId); //clone出一个,而非直接替换使用
// Wrap our data in a context object:
var processingContext = new JsEvalContext(data);
// Process the template
jstProcess(processingContext, templateToProcess);
// Clear the element to which we'll attach the processed template:
peg.innerHTML = '';
// Attach the template:
domAppendChild(peg, templateToProcess);
}
</script>
<link rel="stylesheet" type="text/css" href="css/maps2.deb.css"/>
</head>
<body onload="jsinit()">
<!--
This is the div to which the instantiated template will be attached.
-->
<div id="peg"></div>
<!--
A container to hide our template:
-->
<div style="display:none">
<!--
This is the template div. It will be copied and attached to the div above with:
var apt = jstGetTemplate('apt');
appendChild(panel, apt)
-->
<div id="tpl">
<span jscontent="title">Outline heading</span>
<ul jsdisplay="items.length">
<li jsselect="items">
<!--Recursive tranclusion: -->
<div transclude="tpl"></div>
</li>
</ul>
</div>
</div>
</body>
</html>
6.jsvalues(jsvars同)
- $ 可以通过$引用
JsEvalContext,如果
jsvalues="$varname:varvalue",则可以通过
$varname来引用。
- . 可以修改该节点的属性。如
jsvalues=".id:'Joe';.style.fontSize:'30pt'",这该节点的id,style就会被赋值为该值
- 表达式
jsvalues="sum:1+2"
= this.setAttribute('sum', '3')
.
7.jseval [ 11-jseval.html ]
该属性顾名思义,其值是一段js,在渲染所在节点时可以获得执行。例如:
利用$,创建一个counter变量
processingContext.setVariable('$counter', counter);
<span jscontent="title"
jseval="title? $counter.full++: $counter.empty++">
Outline heading
</span>
在其他片段可以引用。
<div id="titleCountTpl">
<p>
This outline has <span jscontent="$counter.empty"></span> empty titles
and <span jscontent="$counter.full"></span> titles with content.
</p>
</div>
8.jsskip
意义同jsdisplay,当值为真时, 处理器将不在处理当前节点和子节点。 它在增加处理性能方面有一定作用,比如避免不必要的深层树遍历。
<div id="tpl2">
<h1 jsselect="username" jscontent="$this + '\'s Previous Searches'"></h1>
<ul jsskip="true">
<li jsselect="addresses" jscontent="location"></li>
</ul>
</div>
上面的属性的执行顺序为:
transclude
. If a transclude attribute is present no further Jst attributes are processed.
jsselect
. If jsselect
is array-valued, remaining attributes will be copied to each new duplicate element created by the jsselect
and processed when the new elements are processed.
jsdisplay
jsvars
jsvalues
jseval
jsskip
jscontent
参考:http://code.google.com/intl/zh-CN/apis/jstemplate/docs/instructions-ref.htm
分享到:
相关推荐
Vue 3.0是Vue.js框架的最新版本,它带来了许多优化和新特性,使得前端开发更为高效。本文将从入门到精通的角度详细介绍Vue 3.0的关键知识点。 首先,安装Vue 3.0的开发环境是至关重要的。你可以通过npm(Node ...
12. **静态文件与媒体文件管理**:设置静态文件(CSS、JS等)和用户上传的媒体文件的路径,以及在生产环境中如何正确处理它们。 13. **Django管理后台(Admin)**:通过简单的配置,可以让Django自动创建一个用于...
### uniapp 入门教程知识点详解 #### 一、uniapp简介 uniapp是一个基于Vue.js的跨平台应用开发框架,能够实现一次编码多端部署的功能。它支持将应用程序编译为iOS、Android、H5网页及各类主流的小程序平台(如微信...
本资料“Vue.js 从懵逼到入门”旨在帮助初学者理解并掌握Vue.js的基本概念和核心特性。 一、Vue.js简介 Vue.js的核心思想是MVVM(Model-View-ViewModel)模式,它通过双向数据绑定将视图和模型紧密联系起来。Vue.js...
这个"vue入门实例 js html css vue模板"压缩包很可能是为了帮助初学者快速理解如何将Vue与HTML、CSS和JavaScript结合使用,创建一个基本的Web应用。 Vue的核心特性包括组件化、响应式数据绑定、指令系统以及生命...
本教程“Vue 项目构建与开发入门”专为初学者设计,旨在帮助你快速掌握Vue项目的搭建和开发流程。 1. **Vue CLI介绍**: Vue CLI(命令行接口)是Vue生态系统中的一个工具,用于快速设置新项目的基础结构。通过全局...
Vue.js 是一款非常流行的前端JavaScript框架,特别是在2.0版本发布后,其易用性和强大的功能使其在Web开发领域备受青睐。...观看完全部的Vue 2.0入门视频课程,你将对Vue.js有全面的理解,并能自如地应用于实际项目中。
`PrintTask`对象用于与服务器端的打印服务进行交互,而`PrintTemplate`对象则用来定义打印输出的样式和布局。 1. **创建PrintTask对象**:首先,你需要实例化一个`PrintTask`对象,指定地图打印服务的URL。通常,这...
**Node.js Web 应用开发...总结,Node-Template 是一个很好的起点,通过这个模板,初学者可以快速了解并实践 Node.js Web 开发,同时随着对 JavaScript 和相关工具的深入学习,能够构建更复杂、功能丰富的 Web 应用。
Vue.js 是一款轻量级的前端JavaScript框架,它以其易学易用、高效灵活的特点深受开发者喜爱。Vue的核心思想是组件化开发,...通过阅读和实践,你将能够逐步掌握Vue.js的核心概念和技术,为后续的项目开发打下坚实基础。
**Three.js快速入门模板解析** ...通过深入研究和实践"threejs-templates"中的建筑场景模板,开发者不仅可以掌握Three.js的基本用法,还能了解到如何创建逼真的3D建筑环境,从而为更复杂的3D应用打下坚实的基础。
首先,让我们从基础开始,第1章“Vue入门”介绍了Vue的基本结构和安装方式。在这个章节,你会了解到如何通过CDN链接、npm安装或者使用Vue CLI来设置项目环境。同时,还将学习Vue实例的创建以及如何在HTML模板中使用`...
在本入门教程中,我们将深入理解Webpack的工作原理,并学习如何配置和使用它。 ### 1. 模块化 Webpack 将你的项目视为一个模块化的系统,允许你使用 `import` 和 `export` 语句来管理依赖关系。这使得代码更易于...
7. **ES6及新特性**:ECMAScript 6(简称ES6)引入了许多新特性和语法糖,如类(classes)、箭头函数(arrow functions)、模板字符串(template literals)等,提高了代码的可读性和效率。 8. **AJAX和Fetch API**...
"Vue.js入门第一季"是一个针对初学者的教程系列,旨在帮助学习者快速掌握Vue.js的基本概念和核心功能。 在Vue.js中,最重要的概念是组件化。组件是Vue.js的核心,它允许开发者将UI拆分为可复用的部分,每个部分都有...
【HBuilderX入门uniapp】项目是为初学者设计的一个基础教程,主要涵盖了使用HBuilderX工具进行uniapp开发的基本流程。...在实践中不断探索,将使你更加熟练地运用这些工具和技术,从而高效地开发出多平台的小程序应用。
- MongoDB提供了多种语言的驱动程序,如Python、Java、Node.js等,方便集成到不同开发环境中。 - 驱动程序通常封装了MongoDB的命令,简化了数据操作。 10. **最佳实践** - 设计灵活的数据模型,避免强依赖于特定...
用户手册是开发者入门Ember.js的重要参考资料,涵盖了基础概念、实例解析和最佳实践。以下是对手册中关键知识点的详细阐述: ### 第一部分:开始 #### 1.1 静态应用 在Ember.js中,静态应用通常是指那些不涉及...
在这个“vue.js教程.rar”压缩包中,你将找到一份12节的Vue.js入门教程,这将是你踏入Vue世界的一把钥匙。 首先,我们来了解一下Vue.js的基础概念。Vue实例是整个应用的核心,它承载着应用的状态和配置。在创建Vue...