`

jstemplate 入门与实践

 
阅读更多

      在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  environment03-environ.html ]

 

        有几个变量需要注意:

 

  • JsEvalContext 像其他context一样,它在整个代码执行过程中存在,存放所有的上下文数据,可以是字符串也可以json数据,一切你感兴趣的和有用的数据。
 var mydata = {dataProperty: 'Nonny'};
  var context = new JsEvalContext(mydata);
  context.setVariable('declaredVar', 'Ho');
  • this 和 $this
    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.html07-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 3.0是Vue.js框架的最新版本,它带来了许多优化和新特性,使得前端开发更为高效。本文将从入门到精通的角度详细介绍Vue 3.0的关键知识点。 首先,安装Vue 3.0的开发环境是至关重要的。你可以通过npm(Node ...

      Django实战入门项目.rar

      12. **静态文件与媒体文件管理**:设置静态文件(CSS、JS等)和用户上传的媒体文件的路径,以及在生产环境中如何正确处理它们。 13. **Django管理后台(Admin)**:通过简单的配置,可以让Django自动创建一个用于...

      uniapp入门教程.pdf

      ### uniapp 入门教程知识点详解 #### 一、uniapp简介 uniapp是一个基于Vue.js的跨平台应用开发框架,能够实现一次编码多端部署的功能。它支持将应用程序编译为iOS、Android、H5网页及各类主流的小程序平台(如微信...

      Vue.js 从懵逼到入门

      本资料“Vue.js 从懵逼到入门”旨在帮助初学者理解并掌握Vue.js的基本概念和核心特性。 一、Vue.js简介 Vue.js的核心思想是MVVM(Model-View-ViewModel)模式,它通过双向数据绑定将视图和模型紧密联系起来。Vue.js...

      vue入门实例 js html css vue模板

      这个"vue入门实例 js html css vue模板"压缩包很可能是为了帮助初学者快速理解如何将Vue与HTML、CSS和JavaScript结合使用,创建一个基本的Web应用。 Vue的核心特性包括组件化、响应式数据绑定、指令系统以及生命...

      Vue 项目构建与开发入门.zip

      本教程“Vue 项目构建与开发入门”专为初学者设计,旨在帮助你快速掌握Vue项目的搭建和开发流程。 1. **Vue CLI介绍**: Vue CLI(命令行接口)是Vue生态系统中的一个工具,用于快速设置新项目的基础结构。通过全局...

      VUE2.0入门视频09

      Vue.js 是一款非常流行的前端JavaScript框架,特别是在2.0版本发布后,其易用性和强大的功能使其在Web开发领域备受青睐。...观看完全部的Vue 2.0入门视频课程,你将对Vue.js有全面的理解,并能自如地应用于实际项目中。

      arcgis api 3.x for js 入门开发系列十二地图打印GP服务源码

      `PrintTask`对象用于与服务器端的打印服务进行交互,而`PrintTemplate`对象则用来定义打印输出的样式和布局。 1. **创建PrintTask对象**:首先,你需要实例化一个`PrintTask`对象,指定地图打印服务的URL。通常,这...

      Node-Template:node.js web-apps 的入门模板

      **Node.js Web 应用开发...总结,Node-Template 是一个很好的起点,通过这个模板,初学者可以快速了解并实践 Node.js Web 开发,同时随着对 JavaScript 和相关工具的深入学习,能够构建更复杂、功能丰富的 Web 应用。

      vue入门知识PPT

      Vue.js 是一款轻量级的前端JavaScript框架,它以其易学易用、高效灵活的特点深受开发者喜爱。Vue的核心思想是组件化开发,...通过阅读和实践,你将能够逐步掌握Vue.js的核心概念和技术,为后续的项目开发打下坚实基础。

      threejs-templates:ThreeJs的一系列快速入门模板

      **Three.js快速入门模板解析** ...通过深入研究和实践"threejs-templates"中的建筑场景模板,开发者不仅可以掌握Three.js的基本用法,还能了解到如何创建逼真的3D建筑环境,从而为更复杂的3D应用打下坚实的基础。

      vue.js 课件 ppt

      首先,让我们从基础开始,第1章“Vue入门”介绍了Vue的基本结构和安装方式。在这个章节,你会了解到如何通过CDN链接、npm安装或者使用Vue CLI来设置项目环境。同时,还将学习Vue实例的创建以及如何在HTML模板中使用`...

      Webpack 入门教程

      在本入门教程中,我们将深入理解Webpack的工作原理,并学习如何配置和使用它。 ### 1. 模块化 Webpack 将你的项目视为一个模块化的系统,允许你使用 `import` 和 `export` 语句来管理依赖关系。这使得代码更易于...

      javascript入门学习笔

      7. **ES6及新特性**:ECMAScript 6(简称ES6)引入了许多新特性和语法糖,如类(classes)、箭头函数(arrow functions)、模板字符串(template literals)等,提高了代码的可读性和效率。 8. **AJAX和Fetch API**...

      vuejs入门第一季

      "Vue.js入门第一季"是一个针对初学者的教程系列,旨在帮助学习者快速掌握Vue.js的基本概念和核心功能。 在Vue.js中,最重要的概念是组件化。组件是Vue.js的核心,它允许开发者将UI拆分为可复用的部分,每个部分都有...

      HBuilderX入门uniapp

      【HBuilderX入门uniapp】项目是为初学者设计的一个基础教程,主要涵盖了使用HBuilderX工具进行uniapp开发的基本流程。...在实践中不断探索,将使你更加熟练地运用这些工具和技术,从而高效地开发出多平台的小程序应用。

      mongodb入门时候文档

      - MongoDB提供了多种语言的驱动程序,如Python、Java、Node.js等,方便集成到不同开发环境中。 - 驱动程序通常封装了MongoDB的命令,简化了数据操作。 10. **最佳实践** - 设计灵活的数据模型,避免强依赖于特定...

      Ember.js用户手册

      用户手册是开发者入门Ember.js的重要参考资料,涵盖了基础概念、实例解析和最佳实践。以下是对手册中关键知识点的详细阐述: ### 第一部分:开始 #### 1.1 静态应用 在Ember.js中,静态应用通常是指那些不涉及...

      vue.js教程.rar

      在这个“vue.js教程.rar”压缩包中,你将找到一份12节的Vue.js入门教程,这将是你踏入Vue世界的一把钥匙。 首先,我们来了解一下Vue.js的基础概念。Vue实例是整个应用的核心,它承载着应用的状态和配置。在创建Vue...

    Global site tag (gtag.js) - Google Analytics