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电信网通双线自动选择技巧
Nov 18 Javascript
小议Javascript中的this指针
Mar 18 Javascript
让图片旋转任意角度及JQuery插件使用介绍
Mar 20 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
微信小程序 数据遍历的实现
Apr 05 Javascript
基于vue实现圆形菜单栏组件
Jul 05 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
Nov 01 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
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
PHP4之真OO
2006/10/09 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php实现可运算的验证码
2015/11/10 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
2013/05/08 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
pytorch forward两个参数实例
2020/01/17 Python
实例代码讲解Python 线程池
2020/08/24 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
教师新年寄语
2014/04/03 职场文书
《春天来了》教学反思
2014/04/07 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书