还是先给出一个样例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>开发一个完整使用backbone框架的前端Web应用</title>
<script src="Js/jquery-1.8.2.min.js" type="text/javascript"></script>
<script src="Js/underscore-min.js" type="text/javascript"></script>
<script src="Js/backbone-min.js" type="text/javascript"></script>
<style type="text/css">
body
{
font-size: 12px;
}
ul
{
list-style-type: none;
padding: 0px;
margin: 0px;
width: 270px;
}
ul li
{
margin: 5px 0px;
}
ul .lh
{
font-weight: bold;
border-bottom: solid 1px #555;
background-color: #eee;
height: 23px;
line-height: 23px;
}
ul .lc
{
border-bottom: dashed 1px #ccc;
height: 23px;
line-height: 23px;
}
ul li span
{
padding-left: 10px;
width: 80px;
float: left;
}
</style>
</head>
<body>
<ul id="ulshowstus">
<li class="lh">
<span>编号</span>
<span>姓名</span>
<span>分数</span>
</li>
</ul>
<br />
<ul>
<li>编号:
<input id="txtCode" type="text" />
</li>
<li>姓名:
<input id="txtName" type="text" />
</li>
<li>分数:
<input id="txtScore" type="text" />
</li>
<li>
<input id="btnSubmit" type="button"
value="提交" />
</li>
</ul>
<script type="text/template" id="stus-tpl">
<li class="lc">
<span><%=Code%></span>
<span><%=Name%></span>
<span><%=Score%></span>
</li>
</script>
</body>
<script type="text/javascript">
var student = Backbone.Model.extend({
defaults: {
Code: "10001",
Name: "张三",
Score: 100
}
});
var stulist = Backbone.Collection.extend({
initialize: function (model, options) {
this.on("add", options.view.showmodel);
}
});
var stuview = Backbone.View.extend({
el: $("body"),
initialize: function () {
this.stul = new stulist(null, { view: this })
},
events: {
"click #btnSubmit": "addmodel"
},
addmodel: function () {
var stum = new student({
Code: $("#txtCode").val(),
Name: $("#txtName").val(),
Score: $("#txtScore").val()
});
this.stul.add(stum);
},
showmodel: function (model) {
this.template = _.template($("#stus-tpl").html());
$("#ulshowstus").append(this.template(model.toJSON()));
}
});
//实例化一个view视图
var stuv = new stuview();
</script>
</html>
backbone.js的router
<body>
<div>
<a href="">首页</a> |
<a href="#search">查询列表</a> |
<a href="#search/abc">关键字查询</a> |
<a href="#search/abc/p2">页码关键字查询</a> |
<a href="#error">其他页</a>
</div>
<div id="divShow"></div>
</body>
<script type="text/javascript">
var $divShow = $("#divShow");
var testrouter = Backbone.Router.extend({
routes: {
'': 'main',
'search': 'search_list',
'search/:key': 'search_key',
'search/:key/p:page': 'search_key_page',
'*search': 'search_default'
},
main: function () {
$divShow.html("首页");
},
search_list: function () {
$divShow.html("查询列表");
},
search_key: function (key) {
$divShow.html("查询关键字为 " + key + " 记录");
},
search_key_page: function (key, page) {
$divShow.html("查询关键字为 " + key + " 记录,页码为 " + page);
},
search_default: function () {
$divShow.html("其他页");
}
});
var router = new testrouter();
Backbone.history.start();
</script>
另外一种的通过事件绑定的方式。
<script type="text/javascript">
var $divShow = $("#divShow");
var testrouter = Backbone.Router.extend({
routes: {
'': 'main',
'search': 'search_list',
'search/:key': 'search_key',
'search/:key/p:page': 'search_key_page',
'*search': 'search_default'
}
});
var router = new testrouter();
router.on("route:main", function () {
$divShow.html("首页");
});
router.on("route:search_list", function () {
$divShow.html("查询列表");
});
router.on("route:search_key", function (key) {
$divShow.html("查询关键字为 " + key + " 记录");
});
router.on("route:search_key_page", function (key, page) {
$divShow.html("查询关键字为 " + key + " 记录,页码为 " + page);
});
router.on("route:search_default", function () {
$divShow.html("其他页");
});
Backbone.history.start();
</script>
这里注意一下绑定规则:
1)“/”反斜杠字符表示内容的分隔,该字符在router类内部会自动转成“([^\/]+)”表达式。例如定义如下匹配的规则:
‘#search/a/b/c’: ‘search_a_b_c’
必须在地址栏中输入如下地址:
http://localhost/Ch7/7-6.html#search/a/b/c
才能执行search_a_b_c函数代码。在输入URL地址时,hash属性部分必须与定义规则时的key值完全一致,因为此时的反斜杠字符仅表示内容的分隔。
2)“:”冒号表示该段内容将以参数的方式传给对应的动作(action)函数,而函数也可以通过以回调参数方式进行接收。例如定义如下匹配的规则:
‘#search/:a/m:b/n:c’: ‘search_a_m_n’
必须在地址栏中输入如下地址:
http://localhost/Ch7/7-6.html#search/1/m2/n3
将会执行search_a_m_n函数代码。在该函数中,形参a对应实参1,形参m对应实参2,形参n对应实参3。在执行函数代码时,这些实参值可以通过定义时的形参值进行传递获取。
3)“”星号表示零个或多个任意字符,该字符在router类内部会自动转成为“(.?)”表达式,它可以与反斜杠字符或冒号组合。例如定义如下匹配的规则:
‘*search/:a/m:b/n:c’: ‘default_a_m_n’
可以在地址栏中输入如下地址:
http://localhost/Ch7/7-6.html#error/1/m2/n3
同样会执行default_a_m_n函数代码,还可以通过形参传值的方式获取冒号后对应的实参值。接下来通过一个完整的示例进行介绍。
//在页面中添加两个<div>元素,第一个元素中添加一个超级链接<a>元素。单击该链接时,进入相应的特定URL地址,同时在第二个<div>元素中显示对应的功能说明和传回的参数值。
<body>
<div>
<a href="#abc/p5">其他页</a>
</div>
<div id="divShow"></div>
</body>
<script type="text/javascript">
var $divShow = $("#divShow");
var testrouter = Backbone.Router.extend({
routes: {
'*path/p:page': 'search_other'
},
search_other: function (path, page) {
$divShow.html("路径名为 " + path + " ,页码为 " + page);
}
});
var router = new testrouter();
Backbone.history.start();
</script>
另外一个案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>route()方法</title>
<script src="Js/jquery-1.8.2.min.js"
type="text/javascript"></script>
<script src="Js/underscore-min.js"
type="text/javascript"></script>
<script src="Js/backbone-min.js"
type="text/javascript"></script>
<style type="text/css">
div
{
margin:5px 0px;
font-size: 13px;
}
</style>
</head>
<body>
<div>
<a href="">首页</a>
<a href="#search">查询列表</a>
<a href="#search/abc">关键字查询</a>
<a href="#search2/abc/p2">页码关键字查询</a>
<a href="#error">其他页</a>
</div>
<div id="divShow"></div>
</body>
<script type="text/javascript">
var $divShow = $("#divShow");
var testrouter = Backbone.Router.extend({
routes: {
'': 'main',
'search/:key': 'search_key',
'search/:key/p:page': 'search_key_page',
'*search': 'search_default'
},
initialize: function () {
this.route("search", 'search_list', function () {
$divShow.html("初始化时,查询列表");
});
},
main: function () {
$divShow.html("首页");
},
search_list: function () {
$divShow.html("查询列表");
},
search_key: function (key) {
$divShow.html("查询关键字为 " + key + " 记录");
},
search_default: function () {
$divShow.html("其他页");
}
});
var router = new testrouter();
router.route('search2/:key/p:page', 'search_key_page',
function (key, page) {
$divShow.html("实例化后,查询关键字为 " + key +
" 记录,页码为 " + page);
});
Backbone.history.start();
</script>
</html>
在页面中使用setInterval方法隔时调用navigate。在调用时,根据累加值的奇偶性跳转到不同的hash属性值中。当执行对应的动作(action)函数,将获取的参数内容显示在页面中,实现动态刷新轮流、显示不同内容的页面效果。
2.实现代码
新建一个HTML文件7-8.html,加入如代码清单7-8所示的代码。
代码清单7-8 navigate方法的使用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>navigate()方法</title>
<script src="Js/jquery-1.8.2.min.js"
type="text/javascript"></script>
<script src="Js/underscore-min.js"
type="text/javascript"></script>
<script src="Js/backbone-min.js"
type="text/javascript"></script>
<style type="text/css">
div
{
margin:5px 0px;
font-size: 13px;
}
</style>
</head>
<body>
<div id="divShow"></div>
</body>
<script type="text/javascript">
var $divShow = $("#divShow");
var testrouter = Backbone.Router.extend({
routes: {
'search2/:key': 'search2_key',
'search3/:key': 'search3_key'
},
search2_key: function (key) {
$divShow.html("查询2关键字为 " + key + " 记录");
},
search3_key: function (key) {
$divShow.html("查询3关键字为 " + key + " 记录");
}
});
var router = new testrouter();
var intnum = 0;
window.setInterval(function () {
intnum++;
if (intnum % 2 == 0)
router.navigate("search2/abc", { trigger: true });
else
router.navigate("search3/def", { trigger: true });
}, 3000);
Backbone.history.start();
</script>
</html>