认识Backbone (四)
Backbone.View(视图)
视图的核心是处理数据业务逻辑、绑定DOM元素事件、渲染模型或者集合数据。
添加DOM元素
render view.render() render 默认实现是没有操作的。 重载本函数可以实现从模型数据渲染视图模板,并可用新的 HTML 更新 this.el。 推荐的做法是在 render 函数的末尾 return this 以开启链式调用。
var testview = Backbone.View.extend({
id: 'show',
render: function (content) {
//this.el.innerHTML = content;
//document.body.appendChild(this.el);
this.$el.html(content).appendTo($('body'));
}
});
var test = new testview();
test.render("hello world!");
访问模型对象
var Book = Backbone.Model.extend({
defaults:{
title: 'backbone',
author: 'Jeremy Ashkenas'
}
});
var book = new Book({title:'ios',author:'apple'});
var BookView = Backbone.View.extend({
id: 'show',
render: function(){
this.$el.html(JSON.stringify(this.model)).appendTo($('body'));
}
});
var bookview = new BookView({model: book});
bookview.render();
访问集合对象
var booklist = [
{title:'ios',author:'apple'},
{title:'android',author:'google'},
{title:'Windows Phone',author:'microsoft'}
];
var books = new Backbone.Collection(booklist); var BookView = Backbone.View.extend({
id: 'show',
render: function(){
var html = '';
_.each(this.collection.models,function(book){
html += JSON.stringify(book)+'
';
});
this.$el.html(html).appendTo($('body'));
}
});
var bookview = new BookView({collection: books});
bookview.render();
使用模板
template view.template([data]) 虽然模板化的视图 不是Backbone直接提供的一个功能, 它往往是一个在视图定义template函数很好的约定。
<script type="text/template" id="templateID">
<%= code > ? '及格' : '不及格' %>
</script>
var ksView = Backbone.View.extend({
id: 'show',
initialize: function(){
this.template = _.template( $('#templateID').html() );
this.$el.appendTo($('body'));
},
render: function(num){
this.$el.html( this.template({code: num}) );
}
});
var ksview = new ksView();
ksview.render(50);
<script type="text/template" id="template">
<ol>
<li>系统:<%=system %></li>
<li>公司:<%=company %></li>
</ol>
</script>
var System = Backbone.Model.extend({
defaults: {
'system': '',
'company': ''
}
});
var system = new System({
'system': 'ios',
'company': 'apple'
});
var systemView = Backbone.View.extend({
id: 'show',
initialize: function(){
this.template = _.template( $('#template').html() );
this.$el.appendTo($('body'));
},
render: function(){
this.$el.html( this.template(this.model.toJSON()) );
}
});
var view = new systemView({model: system});
view.render();
//自定义模板格式
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g
};
var template = _.template("Hello {{ name }}!");
console.log( template({name: "Backbone"}) ); _.templateSettings = {
interpolate: /\$(.+?)\$/g
};
var template = _.template("Hello $name$!");
console.log( template({name: "Backbone"}) );
绑定事件
var View = Backbone.View.extend({
el: '#view',
initialize: function(){
this.render();
},
render: function(){
this.$el.html('这是一个绑定视图事件的容器').appendTo($('body'));
},
events: {
'click': 'alertHello',
},
alertHello: function () {
alert('hello world!');
}
});
var view = new View();
<script type="text/template" id="templateFile">
<input type="button" id="btn" value="<%= name %>" />
<div id="box" style="display:none;"><%= message %></div>
</script>
var View = Backbone.View.extend({
id: 'view',
initialize: function(){
this.template = _.template( $('#templateFile').html() );
this.$el.appendTo($('body'));
this.render();
},
render: function(){
this.$el.html( this.template({
name: '点击我试试',
message: '哇,你把我挖出来了'
}) );
},
events: {
'click #btn': 'toggle'
},
toggle: function(){
$('#box').slideToggle();
}
});
var view = new View();
delegateEvents delegateEvents([events]) 采用 jQuery 的on函数来为视图内的 DOM 事件提供回调函数声明。 如果未传入 events对象,使用 this.events 作为事件源。 事件对象的书写格式为 {"event selector": "callback"}。 省略 selector 则事件被绑定到视图的根元素(this.el)。 默认情况下,delegateEvents 会在视图的构造函数内被调用,因此如果有 events 对象,所有的 DOM 事件已经被连接, 并且我们永远不需要去手动调用本函数。
undelegateEvents undelegateEvents() 删除视图所有委托事件。如果要从临时的DOM中禁用或删除视图时,比较有用。
<script type="text/template" id="templateFile">
<input type="button" id="btn1" value="点我触发事件" />
<input type="button" id="btn2" value="点我删除绑定事件" />
<input type="button" id="btn3" value="点我重新绑定事件" />
<div id="box" style="display: block;">哇,你好棒啊!</div>
</script>
var View = Backbone.View.extend({
id: 'view',
initialize: function(){
this.template = _.template( $('#templateFile').html() );
this.$el.appendTo($('body'));
this.render();
},
render: function(){
this.$el.html( this.template() );
},
events: {
'click #btn1': 'toggle',
'click #btn2': 'unbindEvent'
},
toggle: function(){
$('#box').slideToggle();
},
bindEvent: function(){
this.delegateEvents( this.events );
},
unbindEvent: function(){
this.undelegateEvents();
}
});
var view = new View();
$('#btn3').on('click', function() {
view.bindEvent();
});
认识Backbone (四)的更多相关文章
- JavaScript--模块化编程(笔记)
一直对JS都是一知半解,最近遇到这方面问题,所以在网上学习了一下,现在还没有完全明白,先贴出笔记; 第一章 JavaScript模块化编程(一):模块的写法 一 原始写法 // 模块就是实现特定功能的 ...
- 用Backbone.js创建一个联系人管理系统(四)
原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程 ...
- Backbone源码解析(四):View(视图)模块
View视图故名思义,它控制的是界面.我们可以把一个大的网页分成很多部分的视图,按照backbone的架构,每一个视图对应都是一个对象,我们可以通过元素的钩子(id或者class或者其他选择器)把它们 ...
- (四)backbone - DEMO - 通信录
DEMO介绍 是DEMO - User List 的扩展,增加查询 大体实现 •创建Contact Model var Contact = Backbone.Model.extend({ defaul ...
- 使用backbone的history管理SPA应用的url
本文介绍如何使用backbone的history模块实现SPA应用里面的URL管理.SPA应用的核心在于使用无刷新的方式更改url,从而引发页面内容的改变.从实现上来看,url的管理和页面内容的管理是 ...
- backbone入门示例
最近因为有个项目需要用backbone+mui 所以最近入坑backbone. Backbonejs有几个重要的概念,先介绍一下:Model,Collection,View,Router.其中Mod ...
- 前端MVC框架Backbone 1.1.0源码分析系列
Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的 ...
- 用backbone实现的一个MVC的小demo
一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> ...
- 我对Backbone.js的一些认识
backbone.js已经不是当前最流行的前端框架了,但是对于我而言,依然具有比较好的学习价值.虽然目前来说,react,vue等mvvm框架非常火热,但是感觉自身还不到去使用这种框架的层次.这些技术 ...
随机推荐
- Ubuntu9.04更新源
1.sudo gedit /etc/apt/sources.list 编辑你的源列表,加入以下列表中你认为适合你的,拷贝到你的列表中,然后保存列表. Archive.ubuntu.com更新serve ...
- JarSearch
个人做的小工具分享给大家~~. 支持从压缩文件搜索文件,特别是根据部分类文件名在jar里查找文件,比较方便,效率也还不错. 也支持从目录查找 http://pan.baidu.com/s/1feYaM ...
- HDU 4454 - Stealing a Cake(三分)
我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次 后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值 以下是代码 #i ...
- spring原拦截器配置与新命名空间mvc:interceptors配置拦截器对照与注意事项
原先,我们是这么配置拦截器的 <bean id="openSessionInViewInterceptor"class="org.springframework.o ...
- Coreseek:indexer crashed神秘
浩哥前两天让我再Coreseek该指数再次这样做,由于需求方面变化不大,公司名称应出现指数.在添加的配置文件的面孔sql_field_string:串场.. 此属性特别有用,因为它不仅作为过滤器的特性 ...
- 促销R语言应用性能
1. 绩效评估 时间的确定 R测量时间是在最简单的方式提供是system.time性能. system.time(expr, gcFirst=TRUE) 这个函数会在不减少程序执行性能的情 ...
- POJ 1659 Frogs' Neighborhood
转载请注明出处:http://blog.csdn.net/a1dark 分析:切图论切的第一道题.也是图论的例题.主要用到一个Havel-Hakimi 定理 有以下两种不合理的情形: (1) 某次对剩 ...
- Google是不是真的不能用了?非常奇怪的问题
这几天,事实上是这一阵子. 我连用goagent都无法上google了. 可怜我一直用Gmail邮箱.但如今我连用代理都上不了Gmail了. .. 是我自己电脑本身的问题吗?非常奇怪的问题,我原先用g ...
- Linux 该文件命令查看内容
Linux系统,请使用以下命令来查看文件的内容: cat tac 从最后一行開始显示.能够看出 tac 是 cat 的倒著写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 ...
- 【译】手动处理Team Foundation Server 2010 数据仓库和分析服务数据库
原贴地址:Manually Processing the Team Foundation Server 2010 Data Warehouse and Analysis Services Databa ...