Backbone.js框架中简单的View视图编写学习笔记


Posted in Javascript onFebruary 14, 2016

传统上用jQuery操作DOM,就类似C语言中的goto语句,随着项目复杂度增大,会越来越难以维护。
关于MVC(以及后续的MVP,MVVM),网上资源很多,就不展开。我们直接用代码来操练。

index.html
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Backbone</title>
</head>

<body>
  <div class="wrapper"></div>
  <script src="js/lib/jquery.min.js"></script>
  <script src="js/lib/underscore-min.js"></script>
  <script src="js/lib/backbone-min.js"></script>
  <script src="build/x.js"></script>
</body>
</html>

其中,x.js是用duo生成后的js。文件中引用的几个js,都可以从百度静态资源库中下载到

1.js

var ListView = Backbone.View.extend({
 //el: $('.wrapper'),

 // 初始化函数,new时,backbone会自动调用
 initialize: function() {
  this.render();
 },

 // 真正把修改操作同步到浏览器中
 render: function() {
  this.$el.append("<ul><li>Hello techfellow!</li></ul>");
 }
});

var listView = new ListView({el: $('.wrapper')});

执行:

$duo 1.js

知识点说明

  • el:表示该View所代表的DOM元素,在render函数中,会同步到DOM操作中去。
  • initialze:调用new时,会触发的函数调用,类似构造函数。
  • render:触发DOM操作,浏览器会渲染
  • 最后一句,说明在new时,可以传递参数

疑惑
如果写成 new ListView({el: '.wrapper'})也是可以的。
但考虑到el本身的含义,还是加上$更清晰些。

  • $el和$()
  • $(this.el) 等价于 this.$el
  • $(this.el).find('.wrapper') 等价于 this.$('.wrapper')

setElement
如果想修改el内容,包括值和绑定事件,可以使用setElement。下面这个例子中,setElement不仅仅把el的引用从button1改为button2,连click事件也同步修改过去了。

// We create two DOM elements representing buttons
// which could easily be containers or something else
var button1 = $('<button></button>');
var button2 = $('<button></button>');

// Define a new view
var View = Backbone.View.extend({
   events: {
    click: function(e) {
     console.log(view.el === e.target);
    }
   }
  });

// Create a new instance of the view, applying it
// to button1
var view = new View({el: button1});

// Apply the view to button2 using setElement
view.setElement(button2);

button1.trigger('click');
button2.trigger('click'); // returns true

事件处理和模板解析都是前端渲染必需的工作,backbone一般把这些内容放到View里面统一处理。
2.js

var ListView = Backbone.View.extend({
 el: $('.wrapper'),

 events: {
  'click button#add': 'addItem'
 },

 // 初始化函数,new时,backbone会自动调用
 initialize: function() {
  // 用于计数
  this.counter = 0;
  this.render();
 },

 // 真正把修改操作同步到浏览器中
 render: function() {
  this.$el.append("<button id='add'>点击添加</button><ul></ul>");
 },

 // event handler
 addItem: function() {
  this.counter++;
  this.$('ul').append("<li>Hello techfellow, " + this.counter + " time(s)");
 }
});

var listView = new ListView();

执行:

$duo 2.js

知识点

  • this.counter:内部使用的数据,可以initialize中初始化
  • events:声明格式,'event selector': 'func',这比之前$('.wrapper button#add').on('click', function(){...}); 的方式要清晰许多了。

模板

在index.html中加入:

<script type="text/template" id="tplItem">
  <li>Hello techfellow, <%= counter %> time(s)</li>
</script>
<!--要放在2.js前面,否则在执行时,可能遇到找不到tplItem的情况-->
<script src="build/2.js"></script>

在View的声明中修改:

events: {
 'click button#add': 'addItem'
},

template: _.template($('#tplItem').html()),

修改addItem:

addItem: function() {
 this.counter++;
 this.$('ul').append(this.template({counter: this.counter}));
}

同理,这里的模板可以替换为任何第三方模板引擎。
比如:artTemplate

var template = require('./lib/template.js');
...
this.$('ul').append(template('tplItem', {counter: this.counter}));
...
Javascript 相关文章推荐
用js判断浏览器是否是IE的比较好的办法
May 08 Javascript
javaScript 判断字符串是否为数字的简单方法
Jul 25 Javascript
JavaScript iframe的相互操作浅析
Oct 14 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
Apr 14 Javascript
JavaScript实现Fly Bird小游戏
Dec 15 Javascript
JS轮播图实现简单代码
Feb 19 Javascript
js移动端图片压缩上传功能
Aug 18 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
Apr 24 Javascript
vue穿梭框实现上下移动
Jan 29 Vue.js
10个JavaScript中易犯小错误
Feb 14 #Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
Feb 14 #Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 #Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 #Javascript
jQuery插件支持同一页面被多次调用
Feb 14 #Javascript
JavaScript中通过提示框跳转页面的方法
Feb 14 #Javascript
JavaScript中关联原型链属性特性
Feb 13 #Javascript
You might like
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python实现发送邮件及附件功能
2021/03/02 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
python监控文件并且发送告警邮件
2018/06/21 Python
python交换两个变量的值方法
2019/01/12 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
英文自荐信常用句子
2014/03/26 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
服装发布会策划方案
2014/05/22 职场文书
查摆剖析材料范文
2014/09/30 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
活动总结书怎么写
2015/05/11 职场文书
归途列车观后感
2015/06/17 职场文书
保护地球的宣传语
2015/07/13 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript