backbone学习进阶二

还是先给出一个样例

<!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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值