Pure JS (5.2):服务器端与客户端共用页面渲染代码

[size=large][align=center][b]Pure JS (5.2):服务器端与客户端共用页面渲染代码[/b][/align][/size]
  接着上一篇文章,我们来谈谈如何在服务器端和客户端共用 JS 代码,以便实现第一次返回页面时在服务器端完成初始渲染,而之后的操作在客户端进行修改并重新渲染页面的模式。

[size=medium][align=center][b]运行示例[/b][/align][/size]
  首先,需要先运行mongod;然后下载附件中的 PureJS 工程,解压后加载到 eclipse 中,打开文件 main/com/purejs/core/JSServer.java,右键选择 Run As -> Java Application。
  在浏览器中输入 [url]http://localhost:8080[/url], 可以看到如下页面:
[align=center][img]http://dl.iteye.com/upload/picture/pic/92014/4402a1f0-5403-316f-bc6a-342896c42bfc.png[/img][/align]
[quote]  参考 [b]Pure JS (4.2): Web 应用中服务器端 JS 调用 MongoDB 的简单示例[/b]:
  [url]http://xxing22657-yahoo-com-cn.iteye.com/admin/blogs/1076016[/url]
[/quote]
  这个界面与 4.2 中是一样的,但实现方式已经不同了。第一次返回的页面已经包含了部分渲染的结果和 users 数据,而增加 user 或删除 user 将会使用客户端 JS 重新渲染界面。
  接下来,让我们分别看看各部分的 JS 是如何编写的。
[quote]  第一次打开页面时间较长,这可能跟 JS 加载有关。
  但与 JSP 不同,并非每个页面都要花时间编译,而是第一次用到 jQuery 时需要花较长时间加载。
  这在运行测试案例时也会发现(第一个测试案例执行时间较长,之后的测试案例执行都很快)。
[/quote]
[size=medium][align=center][b]包含页面模板的 HTML[/b][/align][/size]
  以下是包含模板的 html 文件,也就是后续需要进行操作的文件:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link href="css/index.css" rel="stylesheet" type="text/css" />
<title>DBO Example</title>
</head>
<body>

<div align="center">
<h1>DBO Example</h1>
<table id="content"></table>
</div>

<script id="data"></script>

<script id="content-tmpl" type="tmpl">
<tr align="left">
<th class="w100">User</th>
<th class="w150">Description</th>
<th class="w100" colspan="2">Operation</th>
</tr>
<tr align="left">
<td> <input class="w90"/> </td>
<td> <input class="w140" /> </td>
<td> <a href="##">Save</a> </td>
<td> <a href="##">Delete</a> </td>
</tr>
</script>

<script id="user-tmpl" type="tmpl">
<tr index="${index}" align="left">
<td> ${name} </td>
<td> <input class="w140" value="${desc}" /> </td>
<td> <a href="##">Save</a> </td>
<td> <a href="##">Delete</a> </td>
</tr>
</script>

<script id="data-tmpl" type="tmpl">
users = ${users};
</script>

<script src="js/lib/jquery.js"> </script>
<script src="js/lib/jquery.tmpl.js"> </script>
<script src="js/lib/json.js"> </script>
<script src="js/lib/pure.js"> </script>
<script src="js/both/views.js"> </script>
<script src="js/index.js"> </script>

</body>
</html>

  【content-tmpl】:包含表格的列标题和最后一行(用于增加 user )。
  【user-tmpl】:表格的一行,包含 user 数据。
  【data-tmpl】:用于在服务器端将 users 数据输出到客户端。

[size=medium][align=center][b]渲染函数[/b][/align][/size]
  在 webapp/js/both/views.js 中,我们可以看到如下代码:

views = {
index: function($, users) {
$(users).each(function(i) { this.index = i; });

var content = $("#content-tmpl").tmpl(),
rows = $("#user-tmpl").tmpl(users);

$("#content").html(content);
$("#content tr:first").after(rows);
}
};

  这里实现了 page.index() 方法,接收两个参数:jQuery 对象和 users 数据,然后完成对页面的渲染。

[size=medium][align=center][b]服务器端 JS[/b][/align][/size]
  与该页面相关的服务器端 JS 位于 scripts/app/page.js:

page = function(){
pure.render.prefix = "webapp/";

return {
index: function(params, req, res) {
var users = dbo.users.list(),
data = { users: JSON.stringify(users) };

return pure.render("index", function($){
views.index($, users);
$("#data").html($("#data-tmpl").tmpl(data));
});
}
}
}();

  在 pure.render 函数中做了两件事:
  1. 调用公共的页面渲染函数进行界面渲染
  2. 将 users 数据输出客户端。

[size=medium][align=center][b]客户端 JS[/b][/align][/size]
  客户端与该页面对应的 JS 文件是 webapp/js/index.js :

$(function(){
bind();

// 每次修改数据时重新排序并渲染页面、绑定事件
function show() {
sort();
views.index($, users);
bind();
}

function sort() {
// users 重新排序,略
}

// 绑定事件
function bind() {
var rows = $("#content tr[index] a"),
last= $("#content tr:last a");

rows.filter(":even").click(update);
rows.filter(":odd").click(remove);

last.eq(0).click(add);
last.eq(1).click(clear);
}

// 增加 user ,需要重新排序和渲染
function add() {
var $input = $(this).parent().parent().find("input"),
$name = $input.eq(0),
$desc = $input.eq(1),
name = $name.val(),
desc = $desc.val();

// 数据验证,略

var user = { name: name, desc: desc };
users.push(user);
save(user);
}

function clear() {
// 清空数据,略
}

// 修改 user ,需要重新排序和渲染
function update() {
var $tr = $(this).parent().parent(),
$desc = $tr.find("input"),
index = $tr.attr("index"),
desc = $desc.val();

// 数据验证,略

var user = users[parseInt(index)];
user.desc = desc;
save(user);
}

// 删除 user ,需要重新排序和渲染,并发送请求
function remove() {
var $tr = $(this).parent().parent(),
index = $tr.attr("index");

$tr.remove();
var name = users.splice(index, 1)[0].name;

show();
pure.post({ action: "users.remove", params: name });
}

// 在增加或保存修改 user 时调用,重新排序和渲染,并发送请求
function save(user) {
show();
pure.post({ action: "users.save", params: user });
}
});

  以上就是服务器端和客户端共用 JS 的过程了。除此之外,数据验证函数也可以提取出来,在服务器端和客户端共用,有时间的话请自行尝试吧。
  谢谢。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值