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 相关文章推荐
jquery下jstree简单应用 - v1.0
Apr 14 Javascript
JS中Iframe之间传值及子页面与父页面应用
Mar 11 Javascript
最好用的省市二级联动 原生js实现你值得拥有
Sep 22 Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 Javascript
浅谈javascript对象模型和function对象
Dec 26 Javascript
每日十条JavaScript经验技巧(二)
Jun 23 Javascript
jQuery 局部div刷新和全局刷新方法总结
Oct 05 Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
将angular-ui的分页组件封装成指令的方法详解
May 10 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 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
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
详解python中的异常捕获
2020/12/15 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
我有一个梦想演讲稿
2014/05/05 职场文书
宿舍标语大全
2014/06/19 职场文书
瘦西湖导游词
2015/02/03 职场文书
闪闪的红星观后感
2015/06/08 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python