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 (四)的更多相关文章

  1. JavaScript--模块化编程(笔记)

    一直对JS都是一知半解,最近遇到这方面问题,所以在网上学习了一下,现在还没有完全明白,先贴出笔记; 第一章 JavaScript模块化编程(一):模块的写法 一 原始写法 // 模块就是实现特定功能的 ...

  2. 用Backbone.js创建一个联系人管理系统(四)

    原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程 ...

  3. Backbone源码解析(四):View(视图)模块

    View视图故名思义,它控制的是界面.我们可以把一个大的网页分成很多部分的视图,按照backbone的架构,每一个视图对应都是一个对象,我们可以通过元素的钩子(id或者class或者其他选择器)把它们 ...

  4. (四)backbone - DEMO - 通信录

    DEMO介绍 是DEMO - User List 的扩展,增加查询 大体实现 •创建Contact Model var Contact = Backbone.Model.extend({ defaul ...

  5. 使用backbone的history管理SPA应用的url

    本文介绍如何使用backbone的history模块实现SPA应用里面的URL管理.SPA应用的核心在于使用无刷新的方式更改url,从而引发页面内容的改变.从实现上来看,url的管理和页面内容的管理是 ...

  6. backbone入门示例

    最近因为有个项目需要用backbone+mui  所以最近入坑backbone. Backbonejs有几个重要的概念,先介绍一下:Model,Collection,View,Router.其中Mod ...

  7. 前端MVC框架Backbone 1.1.0源码分析系列

    Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的 ...

  8. 用backbone实现的一个MVC的小demo

    一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> ...

  9. 我对Backbone.js的一些认识

    backbone.js已经不是当前最流行的前端框架了,但是对于我而言,依然具有比较好的学习价值.虽然目前来说,react,vue等mvvm框架非常火热,但是感觉自身还不到去使用这种框架的层次.这些技术 ...

随机推荐

  1. Python处理海量手机号码

    Python处理海量手机号码 一.任务描述 上周,老板给我一个小任务:批量生成手机号码并去重.给了我一个Excel表,里面是中国移动各个地区的可用手机号码前7位(如下图),里面有十三张表,每个表里的电 ...

  2. 【Java&Android开源库代码剖析】のAndroid-Universal-Image-Loader-part1

    做Android app开发的同学应该都听说过或者用过nostra13的Android-Universal-Image-Loader开源库,它在图片异步加载.缓存和显示等方面提供了强大灵活的框架.之前 ...

  3. Codeforces 196 C. Paint Tree

    分治.选最左上的点分给根.剩下的极角排序后递归 C. Paint Tree time limit per test 2 seconds memory limit per test 256 megaby ...

  4. 命令模式在MVC框架中的应用

    事实上在项目开发中,我们使用了大量的设计模式,不过这些设计模式都封装在框架中了,假设你想要不只局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之中的一个就是命令模式,先来看看模式 ...

  5. Help Johnny-(类似杭电acm3568题)

    Help Johnny(类似杭电3568题) Description Poor Johnny is so busy this term. His tutor threw lots of hard pr ...

  6. mysql基础:登录退出,修改用户密码,添加删除用户

    今天刚开始学习mysql,最先接触用户管理,给大家分享下 注:mysql中命令的大小写都可以的 ==========登录退出相关=================== root@jack-deskto ...

  7. Android从raw、assets、SD卡中获取资源文件内容

    先顺带提一下,raw文件夹中的文件会和project一起经过编译,而assets里面的文件不会~~~   另外,SD卡获取文件需要权限哦! //从res文件夹中的raw 文件夹中获取文件并读取数据 p ...

  8. HDU 3639 Hawk-and-Chicken(良好的沟通)

    HDU 3639 Hawk-and-Chicken 题目链接 题意:就是在一个有向图上,满足传递关系,比方a->b, b->c,那么c能够得到2的支持,问得到支持最大的是谁,而且输出这些人 ...

  9. Android FragmentStatePageAdapter的使用Demo

    上一篇写过FragmentPagerAdapter,这篇来介绍FragmentStatePagerAdapter,那么两者之间有何差别呢: FragmentPagerAdapter很多其它的用于少量界 ...

  10. 为什么推荐std::string而不是char*

    例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...