Backbone 学习笔记 04
视图
前面说的模型(Model)和集合(Collection), 都属于底层的数据处理, 真正的页面交互是视图(View), 它的核心功能是处理数据业务逻辑、绑定 DOM 元素事件、渲染模型或集合数据。
视图基础
在定义一个视图对象之前, 需要构建一个视图类。在构建类时, 可以设置 el
元素关联 DOM 中的元素; 也可以指定与视图相关的模型或集合类名, 实现各个类之间对象的数据互访问。
定义视图对象
先通过 extend
方法构建一个视图类, 再通过关键字 new
方法实例化视图对象, 在对象中可以调用视图类中的方法。
var testView = Backbone.View.extend({
// 构建类的逻辑结构
...
});
// 根据构建的类实例化一个 test 视图对象
var test = new testView();
示例一 : 通过视图对象添加 DOM 元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>通过视图对象添加 DOM 元素</title>
<style>
.cls_6{
font-size: 12px;
}
</style>
</head>
<body>
<script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="http://apps.bdimg.com/libs/backbone.js/1.0.0/backbone-min.js"></script>
<script>
var testView = Backbone.View.extend({
id : "show",
className : "cls_6",
render : function(content){
this.el.innerHTML = content;
document.body.appendChild(this.el);
}
});
// 根据构建的类实例化一个 test 视图对象
var test = new testView();
test.render("我在学习Backbone!")
</script>
</body>
</html>
#### 视图对象访问模型对象
示例二 : 视图对象访问模型对象
<div id="show" class="cls_6"></div>
<script>
var student = Backbone.Model.extend({
defaults : {
Code : "",
Name : "",
Score : 0
}
});
var stus = new student({
Code : "10001",
Name : "张三",
Score : 120
});
var stusView = Backbone.View.extend({
el : "#show",
render : function(content){
this.el.innerHTML = JSON.stringify(this.model);
}
});
// 根据构建的类实例化一个 test 视图对象
var stuv = new stusView({ model : stus });
stuv.render();
视图对象访问集合对象
示例三 : 视图对象访问集合对象
var stumodels = [{
Code : "10001",
Name : "张三",
Score : 120
}, {
Code : "10002",
Name : "李四",
Score : 150
}];
var stuList = new Backbone.Collection(stumodels);
var stusView = Backbone.View.extend({
el : "#show",
render : function(content){
var curlist = this.collection.models;
for(var i = 0; i < curlist.length; i++){
this.el.innerHTML += JSON.stringify(curlist[i]) + "<br />"
}
}
});
// 根据构建的类实例化一个 test 视图对象
var stuv = new stusView({ collection : stuList });
stuv.render();
视图的模板
视图中的模板分为两部分 :
第一部分在页面中使用 <script>
元素定义。定义时, 只要将元素的 type
属性设置为 text/template
, 表明该元素包含的代码区域都为模板区。在模板区中, 采用 <%= 变量名称 %>
的形式定义变量, 并且可以处理业务逻辑。然后, 在 Javascript 代码中通过字典的方式传递给变量。
第二部分是在 JavaScript 代码中, 通过 _.template()
函数访问页面定义的模板内容, 当重载模板内容时, 可以通过字典的形式向模板中传递变量对应的值。
处理逻辑代码
使用 <script>
元素定义的页面模板区域中, 在 <% %>
区域内, <% %>
表示区别于其他 HTML 元素的特殊符号, =
表示取值, <%= %>
区域内的变量会在调用模板时, 被以字典方式传入的对应值所取代, 如果是字符内容则原样输出, <%= %>
区域内还是支持简单的 JavaScript 语句。
示例四 : 处理逻辑代码
<body>
<div id="score"></div>
<script type="text/template" id="score-tpl">
<%= score >= 600 ? "优秀" : "及格" %>
</script>
<script>
var stuView = Backbone.View.extend({
el : $("#score"),
initialize : function(){
this.template = _.template($("#score-tpl").html());
},
render : function(pscore){
this.$el.html(this.template({ score : pscore }))
}
});
var stuv = new stuView();
stuv.render(600);
显示多项内容的模板
示例五 : 显示多项内容的模板
var student = Backbone.Model.extend({
defaults : {
Code : "",
Name : "",
Score : 0
}
});
var stus = new student({
Code : "10001",
Name : "张三",
Score : 120
});
var stuView = Backbone.View.extend({
el : $("#ulshowstus"),
initialize : function(){
this.template = _.template($("#stus-tpl").html());
},
render : function(){
this.$el.html(this.template(this.model.toJSON()));
}
});
var stuv = new stuView({ model : stus });
stuv.render();
视图中的元素事件
在构建视图类时, 可以添加一个 events
属性, 该属性的功能是将 DOM 与触发的事件和执行的函数相绑定, 事件绑定的格式如下 :
eventName element : function
视图中简单事件绑定
示例六 : 视图中简单事件绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>视图中简单事件绑定</title>
<style>
body{
font-size: 12px;
}
div{
width: 260px;
padding: 5px;
}
.changed{
border: 1px solid #555;
}
</style>
<script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="http://apps.bdimg.com/libs/backbone.js/1.0.0/backbone-min.js"></script>
</head>
<body>
<script>
var stuView = Backbone.View.extend({
el : $("body"),
initialize : function(){
this.render();
},
render : function(){
this.$el.append("<div id='backbone'>Backbone是构建前端MVC的利器</div>");
},
events : {
"click div#backbone" : "togcls"
},
togcls : function(){
$("#backbone").toggleClass("changed");
}
});
var stuv = new stuView();
</script>
</body>
</html>
绑定视图模板中多个事件
示例七 : 绑定视图模板中多个事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>绑定视图模板中多个事件</title>
<style>
body{
font-size: 12px;
}
div{
width: 260px;
padding: 5px;
}
.changed{
border: 1px solid #555;
}
</style>
<script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="http://apps.bdimg.com/libs/backbone.js/1.0.0/backbone-min.js"></script>
</head>
<body>
<div id="main"></div>
<script type="text/template" id="main-tpl">
<div id="backbone"><%= mess %></div>
<input type="button" value="点击一下" id="btnshow" />
</script>
<script>
var stuView = Backbone.View.extend({
el : $("#main"),
initialize : function() {
this.template = _.template($("#main-tpl").html());
this.render();
},
render :function(){
this.$el.html(this.template({ mess : "Backbone是构建前端MVC的利器" }))
},
events : {
"click #backbone" : "togglecls",
"click #btnshow" : "toggleshow"
},
togglecls : function(){
$("#backbone").toggleClass("changed");
},
toggleshow : function(){
$("#backbone").toggle();
}
});
var stuv = new stuView();
</script>
</body>
</html>
动态绑定和取消视图中的事件
除了构建视图类中, 通过添加 events
属性的方式声明绑定元素的事件之外, 视图内部提供了 delegateEvents
和 undelegateEvents
方法, 用于动态绑定和取消绑定元素的事件。
delegateEvent
方法的功能是重新绑定 events
属性值中已声明的全部元素事件, 其调用格式如下 :
delegateEvents([events])
undelegateEvent
方法的功能是取消所有已绑定元素的事件, 调用格式如下 :
undelegateEvent()
使用 Backbone 框架开发前端 Web 应用
通过前面的学习, 我们对框架 Backbone 框架的各个主要功能类模块有了一定了解, 总体来讲, Backbone 框架中的 model
对象表示数据模型, 用于定义数据结构; collection
对象是管理数据模型的集合, 用于保存数据或查找数据; view
对象主要功能是数据显示, 用于绑定 DOM 元素事件和处理页面逻辑。下面通过一个完整的例子, 详细介绍利用 Backbone 框架开发一个单页面应用。
1.功能描述
包含两个功能, 首先是数据录入功能, 在页面中添加3个文本输入框分别用于输入”编号”、”姓名”、”分数”; 添加一个提交按钮, 单击该按钮时, 将输入的数据以模型对象的方式添加到集合对象中。其次是数据显示功能, 当输入的数据添加完成之后, 将已添加的数据通过视图对象显示在页面的指定元素中。
2.实现代码