@Wangww0925
2020-07-15T07:13:28.000000Z
字数 11542
阅读 575
模板引擎 jsRender/jsViews
JsViews是基于JsRender并具有动态绑定功能的模板
官网: https://www.jsviews.com/#jsvapi
jsviews.min.js 下载: https://www.jsviews.com/#download
1、定义模板: <script type="text/x-jsrender" id="Tem"></script>2、引入js3、数据:要json对象4、使用:方法一: 使用 myTmpl.link()【--推荐】1. 创建模板:var html =$.templates("#Tem");2. 调用link()模板的方法,渲染模板: html.link("#content", data)方法二: $.link.myTem()1. $.templates("myTem", "#Tem");2. $.link.myTem("#content", data, helpersOrContext, noIteration);3. 参数说明:myTem: 命名模板为myTem,可以随意修改,但是要与$.link.myTem()的myTem保持一致data: 数据helpersOrContext:上下文辅助方法或属性,使用 {:~属性名} 调用noIteration:不传,或者 true,以防止对数组数据进行迭代
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><p>{{:name}}</p></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {name:"www"}// 4、方法一$.templates("#temp").link("#content", data);// 4、方法二// var temp = $.templates("temp", "#temp")// $.link.temp("#content", data);</script></body></html>
data-link="属性名"注意:{^{:name}}动态绑定数据,data-link="name"动态更改数据,trigger=false让其失去焦点才触发
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><p>输入就触发数据更改: <input type="text" data-link="name"></p><p>失去焦点才触发数据更改: <input type="text" data-link="name trigger=false"></p><p>动态绑定数据: {^{:name}}</p></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {name:"www"}// 4、方法一$.templates("#temp").link("#content", data);</script></body></html>
注意:
使用data-link="{on ...}" 或者 {^{on ...}}
{^{on ...}} 该元件是由标签包裹标签(或多个标签),标记为按钮
{^{on ...}} 仅包装文本时,{^{on ...}}自动转为 <button>标签
{^{on ... tmpl='文本'}} 使用 tmpl='文本' 属性生成 带有文本的<button>标签
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.red {color: red;}</style></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><p>{{:name}}</p><p><span data-link="{on ~add}">点击1</span>{^{on ~add}}<button>点击2</button>{{/on}}{^{on ~add}}点击3{{/on}}{^{on ~add tmpl="点击4" /}}{^{on ~add /}}{^{on ~add height=18 width=75 class="red" id="btn5"}}点击6{{/on}}</p></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {name: "www"}var fun = {add: function (){$("#content").append("你点了我" + (new Date()) + "<br>")}}// 4、方法二var temp = $.templates("temp", "#temp");$.link.temp("#content", data, fun);</script></body></html>
注意: data-link="class{:isRed ? 'red' : 'blue'}" 和 merge
<p data-link="class{:isRed ? 'redBorder red' : 'redBorder blue'}">hello world</p><p class="redBorder" data-link="class{merge:isTrue toggle='red yellowBg'}class{merge:!isTrue toggle='blue'}">www</p>
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.red {color: red;}.blue {color: blue;}.redBorder {border: 1px solid red;}.yellowBg{background-color: yellow;}</style></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><h3>写法一</h3><p>isRed : <input type="checkbox" data-link="isRed"> {^{:isRed}}</p><p data-link="class{:isRed ? 'redBorder red' : 'redBorder blue'}">hello world</p><hr><h3>写法二</h3><p>isTrue : <input type="checkbox" data-link="isTrue"> {^{:isTrue}}</p><p class="redBorder" data-link="class{merge:isTrue toggle='red yellowBg'}class{merge:!isTrue toggle='blue'}">www</p></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {isRed: true,isTrue: true}// 4、方法二$.templates("#temp").link("#content", data);</script></body></html>
注意:
<p data-link="css-color{:color}css-background-color{:bg}css-border{:border}class{merge:isTrue toggle='fb'}{:text}"></p>
例子
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.fb {font-weight: 700;font-size: 20px;}</style></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender">内容: <input type="text" data-link="text"><br>color: <input type="text" data-link="color"><br>bg: <input type="text" data-link="bg"><br>border: <input type="text" data-link="border"><br><p data-link="css-color{:color}css-background-color{:bg}css-border{:border}class{merge:isTrue toggle='fb'}{:text}"></p></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {color: 'red',bg: 'yellow',border: '1px solid blue',isTrue: true,text: '你好呀'}// 4、方法二$.templates("#temp").link("#content", data);</script></body></html>
注意: data-link="visible{:isShow}" 和 <input type="checkbox" data-link="isShow">
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><p><input type="checkbox" data-link="isShow"> {^{:isShow}}</p><div data-link="visible{:isShow}">isShow为 真 显示</div><div data-link="visible{:!isShow}">isShow为 假 显示</div></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {isShow: true}// 4、方法二$.templates("#temp").link("#content", data);</script></body></html>
$.observable(data.info).insert({ name: 'new', age: 18 }); // insert添加新的内容
$.observable(data.info).move(1, 0); // move 将索引1移到索引0的前面
$.observable(data.info).refresh(data.info.slice().reverse()); // refresh 执行数组翻转操作等
$.observable(data.info).remove(); // remove移除最后一项
$.observable(data.info).remove(2); // remove移除索引为2的数据
例子
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.w50{width: 50px;}</style></head><body><p><input type="text" id="name"><input type="text" id="age"><button onclick="add()">insert 新增</button></p><p>将索引 <input type="text" id="move1" class="w50" value="1" > 移到索引 <input type="text" id="move2" class="w50" value="0">前<button onclick="move()">move 移动</button></p><button onclick="refresh()">refresh 排序</button><button onclick="remove()">删除最后一项</button><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><table><tbody><tr><th>序列</th><th>名字</th><th>年龄</th></tr>{^{for info}}<tr align="center"><td>{^{:#index + 1}}</td><td>{^{:name}}</td><td>{^{:age}}</td></tr>{{/for}}</tbody></table></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {info: [{name: "www",age: 18},{name: "abc",age: 20},{name: "nh",age: 21}]}// 4、方法一$.templates("#temp").link("#content", data);// 数组动态更改方法function add(){$.observable(data.info).insert({ name: $("#name").val(), age: $("#age").val() });}function move(){$.observable(data.info).move($("#move1").val(), $("#move2").val());}function refresh(){$.observable(data.info).refresh(data.info.slice().reverse());}function remove(){$.observable(data.info).remove();}</script></body></html>
arrayChange注意:
/*** 监听data数据更改 arrayChange监听事件* 数据需要用 [] 包裹*/$([data.arr]).on("arrayChange", function (e, obj){/*** change: 更改事件* index: 索引* items: 更改的内容*/// console.log(e, obj)});
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.w50{width: 50px;}</style></head><body><p><input type="text" id="val"><button onclick="add()">insert 新增</button></p><button onclick="remove()">删除最后一项</button><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender">{^{for arr}}<li>{{:~root.arr[#getIndex()]}}</li>{{/for}}</script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {arr: ['aa','bb','cc']}// 4、方法一$.templates("#temp").link("#content", data);// 动态更改方法function add(){$.observable(data.arr).insert($("#val").val())}function remove(){$.observable(data.arr).remove();}/*** 监听data数据更改 arrayChange监听事件* 数据需要用 [] 包裹*/$([data.arr]).on("arrayChange", function (e, obj){/*** change: 更改事件* index: 索引* items: 更改的内容*/// console.log(e, obj)});</script></body>
$.observable(data.person).setProperty("name", 'newName'); // setProperty 修改person下的name属性
$.observable(data.person).removeProperty("like"); // removeProperty 删除person下的like属性
例子
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.w50{width: 50px;}</style></head><body><p><input type="text" id="name"><button onclick="modify()">setProperty 修改</button></p><button onclick="remove()">removeProperty 删除like</button><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><span>{^{:person.name}}</span><span>{^{:person.age}}</span><span>{^{:person.like}}</span></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {person:{name: "www",age: 18,like: "花草树木"}}// 4、方法一$.templates("#temp").link("#content", data);// 对象动态更改方法function modify(){$.observable(data).setProperty("person.name",$("#name").val());}function remove(){$.observable(data).removeProperty("person.like");}</script></body></html>
propertyChange注意:
// data: 监听的数据// propertyChange 监听事件$(data).on("propertyChange", function (e, obj){/*** obj对象属性* path: 更改的属性名* oldValue: 旧的数据* value:新的数据*/});
例子
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>.w50{width: 50px;}</style></head><body><p><input type="text" id="name"><button onclick="modify()">setProperty 修改</button></p><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><span>{^{:name}}</span></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {name: "www"}// 4、方法一$.templates("#temp").link("#content", data);// 动态更改方法function modify(){$.observable(data).setProperty("name",$("#name").val())}// 监听data数据更改;propertyChange 监听事件$(data).on("propertyChange", function (e, obj){/*** obj对象属性* path: 更改的属性名* oldValue: 旧的数据* value:新的数据*/$("body").append("将data." + obj.path + "原数据 " + obj.oldValue + "改成 " + obj.value + '<br>')});</script></body></html>
$.view(this).data
$("ul li").unbind();$("ul li").click(function(){var data = $.view(this).data;console.log(data)})
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script id="temp" type="text/x-jsrender"><ul>{^{for data}}<li>{{:#data}}</li>{{/for}}</ul></script><!-- 2、引入js --><script src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script src="jsviews.min.js"></script><script>// 3、数据:要json对象var data = {data: [1,2,3,4,5]}// 4、方法一$.templates("#temp").link("#content", data);// 点击li$("ul li").unbind();$("ul li").click(function(){var data = $.view(this).data;console.log(data);})</script></body></html>
$.view(this).getIndex()
$("ul li").unbind();$("ul li").click(function(){var index = $.view(this).getIndex();console.log(index)})
$.view(this).parent.data || $.view(this).parent.parent.parent.data注意根据具体数据一层一层往上找
$("ul li").unbind();$("ul li").click(function(){var parent = $.view(this).parent.data;console.log(parent);var parent1 = $.view(this).parent.parent.parent.data;console.log(parent1);})
作者 wendy
2018 年 12月 21日