一、什么是转换器?
在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>
相关推荐
6. **递归模板**:JsRender 支持递归模板,这意味着可以在模板中嵌套使用同一个模板,这对于处理层次结构的数据非常有用。 7. **双向数据绑定**:尽管JsRender 主要是为单向数据绑定设计的,但它可以通过配合...
`jQuery JSRender` 是一款高效且功能强大的JavaScript模板引擎,它是jQuery插件家族的一员,专为构建动态数据驱动的Web界面而设计。该库允许开发者通过简洁易读的语法创建复杂的HTML模板,从而在不涉及大量DOM操作的...
jQuery作为一款经典且广泛使用的JS库,引领了链式语法和简化AJAX操作的潮流。本篇文章将深入探讨JavaScript框架,特别是那些与jQuery类似的特性,并介绍如何使用这些特性进行更有效的前端开发。 首先,链式语法是...
5. **与其他库的集成**:由于jQuery的广泛使用,CLNDR可以轻松地与其他jQuery插件(如Bootstrap、FullCalendar等)集成,实现更丰富的功能,如日期选择器、时间戳转换等。 6. **响应式设计**:CLNDR考虑到了移动...
在`views.py`中,将数据转换为JSON格式并传递给模板: ```python from django.shortcuts import render import json def home(request): data = {'site': '自强学堂', 'author': '涂伟忠'} return render...
在 React 中,使用 JSX 语法来创建 VDOM 节点,通过 `ReactDOM.render()` 方法将 VDOM 渲染到页面上。React 还提供了 `React.createElement()` 方法来手动创建 VDOM 节点。 ### Diff 算法 Diff 算法是 VDOM 中的...
### Python使用Flask与JS进行前后台交互的知识点解析 #### 一、Flask简介 Flask是一款用Python编写的轻量级Web应用框架。它采用Werkzeug WSGI工具包和Jinja2模板引擎,核心设计小巧但功能强大且高度可扩展。Flask...
它提供了丰富的风格模板,能够满足不同设计需求,且使用简便,使得开发者可以快速集成到项目中,提升用户体验。 首先,layDate的核心功能是提供一个交互友好的日期选择器,用户可以通过点击或输入来选取特定的日期...
6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态...
6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态...
实际的示例中,我们首先加载了jQuery、Underscore.js和Backbone.js的库文件,以及Bootstrap的样式。然后在页面上定义了一个表格来显示数据。通过Backbone的Model获取到数据后,视图的change事件监听器会响应这些变化...
为了确保AJAX请求正常工作,还需要在`application.js`中引入jQuery库,因为Rails默认使用jQuery进行AJAX操作: ```javascript //= require jquery //= require turbolinks //= require_tree . ``` Turbolinks是...
开发者定义一个`render()`方法,该方法将模型的数据转换为HTML字符串,然后将结果插入到视图的DOM元素中。 ### 5. URL路由(Router) 路由器是Backbone中的导航控制器,将URL片段映射到特定的视图或操作上。通过...
这里使用`safe`过滤器是为了防止Django模板引擎试图转义JSON字符串。 另一种常见的情景是使用Ajax进行异步请求,实现页面的动态更新。在这种情况下,前端会通过Ajax发送请求,后台接收到请求后处理数据,然后返回...
在HTML模板文件(如`mars_info.html`)中,我们可以使用JavaScript和前端框架(如jQuery或Vue.js)动态展示抓取到的火星信息,或者直接在HTML中静态展示。确保模板文件与Flask应用在同一目录下,或者配置正确的模板...