@Wangww0925
2020-07-15T07:13:28.000000Z
字数 11542
阅读 512
模板引擎
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、引入js
3、数据:要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日