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 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
Jun 02 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
jquery实现定时自动轮播特效
Dec 10 Javascript
js实现文字滚动效果
Mar 03 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
vue实现学生信息管理系统
May 30 Javascript
微信小程序实现通讯录列表展开收起
Nov 18 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
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
dedecms中使用php语句指南
2014/11/13 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
文本加密解密
2006/06/23 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
python实现文件名批量替换和内容替换
2014/03/20 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
python空元组在all中返回结果详解
2020/12/15 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
AJAX的全称是什么
2012/11/06 面试题
公司营业员的工作总结自我评价
2013/10/05 职场文书
高考自主招生自荐信
2013/10/20 职场文书
旅游文化节策划方案
2014/06/06 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
明确岗位职责
2015/02/14 职场文书
老公婚前保证书
2015/02/28 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python