`
Josh_Persistence
  • 浏览: 1653515 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

JQuery模板 :(七)JsRender中的转换器

阅读更多

一、什么是转换器?

       在JsRender中,转换器是一种方便的处理数据或者是格式化数据的快捷方式,也是一种评估表达式的结果的是重要方式。例如:

{{html:movie.description}} - 对数据进行Html的encode

{{url:getTheFilePath()}} - 对URL进行encode {{daymonth:invoice.date}} - 对日期进行格式化

在JsRender中,可以使用HTML-encode,attribute-encode,URL-encode.当然也可以注册自定义的converters(转换器)。

如果使用JsViews,还可以使用具有双向数据绑定功能的converters,这包括convert和convertBack(反转换器),其中每一个负责一个方向。

 

二、开始使用转换器。

1. 注册转换器:$.views.converters(name, converterFn)

   使用转换器:{{converterName: someExpression}} 

 

简单例子:将输入内容转化为大写的转换器:

$.views.converters("upper", function(val) {
  return val.toUpperCase();
});

{{upper: "upper case: " + nickname}}

 

实用自定义转换器的例子:

 

<!DOCTYPE html>


<html>
<head>
    <link href="http://www.jsviews.com/samples/resources/css/samples.css" rel="stylesheet"/>
    <script src="../jquery/jquery-2.0.3.js"></script>
    <script src="../jsrender/jsrender.js"></script>
</head>
<body>

<div id="person"></div>

<script id="personTemplate" type="text/x-jsrender">
  {{:name}}<br/>
  Upper case nickname: {{upper:nickname}}<br/>
  {{upper: "this will be upper case too"}} 
</script>

<script>
$.views.converters("upper", function(val) {
  return val.toUpperCase();
});

var person = {name: "JoshWang", nickname: "Jack"};

var html = $("#personTemplate").render(person);

$("#person").html(html);
</script>

</body>
</html>

 

 

2. 在converter 的function中可以使用常用的参数和属性:

 

<!DOCTYPE html>


<html>
<head>
    <link href="http://www.jsviews.com/samples/resources/css/samples.css" rel="stylesheet"/>
    <script src="../jquery/jquery-2.0.3.js"></script>
    <script src="../jsrender/jsrender.js"></script>
</head>
<body>

<div id="person"></div>

<script id="personTemplate" type="text/x-jsrender">
  <label>Normal:</label> {{full:first last}}<br/>
  <label>Reverse:</label> {{full:first last format="reverse"}}<br/> 
</script>

<script>
$.views.converters("full", function(first, last) {
  var format = this.tagCtx.props.format;  
  return format === "reverse" ? last.toUpperCase() + " " + first : first + " " + last;
});

var person = {first: "Josh", last: "Wang"};

var html = $("#personTemplate").render(person);

$("#person").html(html);
</script>

</body>
</html>

 其中:this.tagCtx.props.xxx用于访问该标签上的xxx属性,另外如果需要访问整个对象,可以使用:this.tagCtx.view.data

 

 

3. $.views.converters(namedConverters) :用于注册多个转换器

$.views.converters({
  upper: function(val) {...},
  lower: function(val) {...}
});

 

4. $.views.converters(namedConverters[, parentTemplate]):如果传入的converters不是在全局注册的,那么该方法会为所指定的parentTemplate注册私有的转换器资源,即传入的转换器将会被注册成为parentTemplate的私有资源。

$.views.converters({
  upper: function(val) {...},
  lower: function(val) {...}
}, parentTemplate);

 

有用的实例:

 

实例1. 双向绑定和转换器的结合使用。

 

<!DOCTYPE html>


<html>
<head>
    <link href="../css/samples.css" rel="stylesheet"/>
    <script src="../jquery/jquery-2.0.3.js"></script>
    <script src="../jsviews/jsviews.js"></script>
</head>
<body>

<table class="three">
  <thead><tr><th>Data</th><th>DayOff</th><th>Choose day off</th></tr></thead>
  <tbody id="linked"></tbody>
</table>
<div><em>To edit, enter part of the name, or the number, or click here:</em>
<button id="changeDay">Change day</button></div>

<script id="linkedTmpl" type="text/x-jsrender">
  <tr>
    <td data-link="dayOff"></td>
    <td data-link="{intToDay:dayOff}"></td>
    <td><input data-link="{intToDay:dayOff:dayToInt} title{:dayOff}" /></td>
  </tr>
</script>

<script>
var days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ],
  myWeek = {
    dayOff: 1
  };

$.views.converters({
  dayToInt: function(val) {
    var dayOff = parseInt(val);
    if (isNaN(dayOff)) {
      for (var i = 0; i < 7; i++) {
        if ( days[ i ].toLowerCase().slice(0, val.length) === val.toLowerCase()) {
          dayOff = i;
          break;
        }
      }
    }
    if (isNaN(dayOff)) {
      dayOff = val;
    } else {
      this.linkCtx.elem.value = days[dayOff]; // Set the text box value to the Day Off name
    }
    return dayOff;
  },
  intToDay: function( val ) {
    return days[ val ] || val;
  }
});

// Observable property change
$( "#changeDay" ).on( "click", function() {
  var dayOff = myWeek.dayOff;
  $.observable( myWeek ).setProperty( "dayOff", dayOff < 6 ? dayOff + 1 : 0);
});

var myTmpl = $.templates("#linkedTmpl")

myTmpl.link( "#linked", myWeek );

</script>

</body>
</html>

 

 

代码解读:

A、使用转换器来渲染标签:

1)HTML encoding,没有使用自定义的转换器

<td>{{>dayOff}}</td>

2) 渲染数据并转换成显示名:

<td>{{intToDay:dayOff}}</td>

 

B、使用具有数据绑定功能的converter和convertBack

1)动态绑定到数据,没有转换器:

<td data-link="dayOff"></td>

 

2)   动态绑定到数据,并通过转换器转换显示名子:

<td data-link="{intToDay:dayOff}"></td>

 

3)双向的数据绑定将会在数据格式(integer)和显示的名字(text)之间做convert和convertBack,也将会使用tooltip来显示数据的值。

<td><input data-link="{intToDay:dayOff:dayToInt} title{:dayOff}" /></td>

 

实例2:使用转换器绑定到表单元素:

 

<!DOCTYPE html>


<html>
<head>
    <link href="../css/samples.css" rel="stylesheet"/>
    <script src="../jquery/jquery-2.0.3.js"></script>
    <script src="../jsviews/jsviews.js"></script>
</head>
<body>

<div id="amountPickers">
<div class="box">
<div class="subhead">Using convert and 'convert back'
  functions with integer-to-string conversion:</div>
<em>— Binding to form elements, but keeping the
  'amount' data as type 'number'</em><br><br>

<b>Choose amount:</b><br><br>
<input data-link="{intToStr:amount:strToInt}"><br><br>

<b>Choose amount:</b><br><br>
<input name="intVal" value="0" data-link="{intToStr:amount:strToInt}" type="radio">
  0<br>
<input name="intVal" value="1" data-link="{intToStr:amount:strToInt}" type="radio">
  1<br>
<input name="intVal" value="2" data-link="{intToStr:amount:strToInt}" type="radio">
  2<br>
<input name="intVal" value="3" data-link="{intToStr:amount:strToInt}" type="radio">
  3<br>
<input name="intVal" value="4" data-link="{intToStr:amount:strToInt}" type="radio">
  4<br>
<input name="intVal" value="5" data-link="{intToStr:amount:strToInt}" type="radio">
  5<br>
<input name="intVal" value="6" data-link="{intToStr:amount:strToInt}" type="radio">
  6<br>
<input name="intVal" value="7" data-link="{intToStr:amount:strToInt}" type="radio">
  7<br><br>

<b>Choose amount:</b><br><br>
<select data-link="{intToStr:amount:strToInt}">
  <option>0</option>
  <option>1</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  <option>5</option>
  <option>6</option>
  <option>7</option>
</select>
</div>

<div class="box">
<div class="subhead">Convert and 'convert back'
  functions using bit-masks on the integer data value:</div>

<b>Choose amount:</b><br><br>
<input data-link="{getBit:amount bit=0 :setBit}" type="checkbox"> bit 0<br>
<input data-link="{getBit:amount bit=1 :setBit}" type="checkbox"> bit 1<br>
<input data-link="{getBit:amount bit=2 :setBit}" type="checkbox"> bit 2<br>
</div>

<b>Amount: <div class="box subhead" data-link="amount"></div></b>
</div>

<script>
$.views.converters({
  setBit: function (value) {
    // "Convert Back": If checked, set this bit on the data,
  // or if unchecked, unset this bit on the data
    var mask = 1 << this.tagCtx.props.bit,
  // Shift first bit, 0, 1 or 2 bits to the left, to create a mask
      dataValue = this.linkCtx.data[this.linkCtx.fn.paths[0]];
  // Take the current data value
    return value ? (dataValue | mask) : (dataValue & ~mask);
  // Use the mask to set or unset that bit on the data, and return the modified value
  },
  getBit: function (value) {
    // "Convert": Get the bit from the data, and check or uncheck the checkbox
    return (value >> this.tagCtx.props.bit & 1) === 1;
  // Shift 0, 1 or 2 bits to the right, and see if the first bit is set.
  },
  intToStr: function (value) {
    return "" + value;
  },
  strToInt: function (value) {
    return parseInt(value);
  }
});

var data = { amount: 3 };

$( "#amountPickers" ).link( true, data );

</script>

</body>
</html>

 

代码解读:注册了不同的convert和convertBack 转换器,然后使用下面的方式将form中的元素和数据进行了绑定:

<input data-link="{intToStr:amount:strToInt}">

<input type="radio" name="intVal" value="0" data-link="{intToStr:amount:strToInt}">

<select data-link="{intToStr:amount:strToInt}">
  <option>0</option>
  ...
</select>

<input type="checkbox" data-link="{getBit:amount bit=1 :setBit}"> bit 1<br>

 

 

 

0
0
分享到:
评论

相关推荐

    JsRender.zip(jsrender.js和jsrender.min.js合集)

    6. **递归模板**:JsRender 支持递归模板,这意味着可以在模板中嵌套使用同一个模板,这对于处理层次结构的数据非常有用。 7. **双向数据绑定**:尽管JsRender 主要是为单向数据绑定设计的,但它可以通过配合...

    jquery-jsrender.js 下载

    `jQuery JSRender` 是一款高效且功能强大的JavaScript模板引擎,它是jQuery插件家族的一员,专为构建动态数据驱动的Web界面而设计。该库允许开发者通过简洁易读的语法创建复杂的HTML模板,从而在不涉及大量DOM操作的...

    js框架,类似jquery

    jQuery作为一款经典且广泛使用的JS库,引领了链式语法和简化AJAX操作的潮流。本篇文章将深入探讨JavaScript框架,特别是那些与jQuery类似的特性,并介绍如何使用这些特性进行更有效的前端开发。 首先,链式语法是...

    jQuery日历插件CLNDR.zip

    5. **与其他库的集成**:由于jQuery的广泛使用,CLNDR可以轻松地与其他jQuery插件(如Bootstrap、FullCalendar等)集成,实现更丰富的功能,如日期选择器、时间戳转换等。 6. **响应式设计**:CLNDR考虑到了移动...

    Django与JS交互的示例代码

    在`views.py`中,将数据转换为JSON格式并传递给模板: ```python from django.shortcuts import render import json def home(request): data = {'site': '自强学堂', 'author': '涂伟忠'} return render...

    js高级面试题

    在 React 中,使用 JSX 语法来创建 VDOM 节点,通过 `ReactDOM.render()` 方法将 VDOM 渲染到页面上。React 还提供了 `React.createElement()` 方法来手动创建 VDOM 节点。 ### Diff 算法 Diff 算法是 VDOM 中的...

    python使用flask与js进行前后台交互的例子

    ### Python使用Flask与JS进行前后台交互的知识点解析 #### 一、Flask简介 Flask是一款用Python编写的轻量级Web应用框架。它采用Werkzeug WSGI工具包和Jinja2模板引擎,核心设计小巧但功能强大且高度可扩展。Flask...

    layDate电脑日期选择插件

    它提供了丰富的风格模板,能够满足不同设计需求,且使用简便,使得开发者可以快速集成到项目中,提升用户体验。 首先,layDate的核心功能是提供一个交互友好的日期选择器,用户可以通过点击或输入来选取特定的日期...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态...

    BACKBONE.JS 简单入门范例

    实际的示例中,我们首先加载了jQuery、Underscore.js和Backbone.js的库文件,以及Bootstrap的样式。然后在页面上定义了一个表格来显示数据。通过Backbone的Model获取到数据后,视图的change事件监听器会响应这些变化...

    Rails-4-AJAX-Form:Rails 4 AJAX表单示例

    为了确保AJAX请求正常工作,还需要在`application.js`中引入jQuery库,因为Rails默认使用jQuery进行AJAX操作: ```javascript //= require jquery //= require turbolinks //= require_tree . ``` Turbolinks是...

    backbone-basics:BB 应用程序开发

    开发者定义一个`render()`方法,该方法将模型的数据转换为HTML字符串,然后将结果插入到视图的DOM元素中。 ### 5. URL路由(Router) 路由器是Backbone中的导航控制器,将URL片段映射到特定的视图或操作上。通过...

    Django 前后台的数据传递的方法

    这里使用`safe`过滤器是为了防止Django模板引擎试图转义JSON字符串。 另一种常见的情景是使用Ajax进行异步请求,实现页面的动态更新。在这种情况下,前端会通过Ajax发送请求,后台接收到请求后处理数据,然后返回...

    web-scraping-challenge:此回购协议使用美丽的汤和碎片来创建有关火星的网站

    在HTML模板文件(如`mars_info.html`)中,我们可以使用JavaScript和前端框架(如jQuery或Vue.js)动态展示抓取到的火星信息,或者直接在HTML中静态展示。确保模板文件与Flask应用在同一目录下,或者配置正确的模板...

Global site tag (gtag.js) - Google Analytics