首页 > 其他分享 >backbone.js 初探[转]

backbone.js 初探[转]

时间:2023-06-04 10:06:23浏览次数:30  
标签:function backbone js employee 初探 var input model 方法


什么是backbone

backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架。

主要提供了3个东西:1、models(模型) 2、collections(集合) 3、views(视图)

backbone.js文件本身很小,压缩后只有5.3KB,作为一个框架级别的核心JS文件,这个数字很可怕。

除此之外,这个JS还必须依赖于另一个JS文件:underscore.js(包含许多工具方法,集合操作,js模板等等)。

 

简介

用Backbone.Model表示应用中所有数据,models中的数据可以创建、校验、销毁和保存到服务端。

当models中值被改变时自动触发一个"change"事件、所有用于展示models数据的views都会侦听到这个事件,然后进行重新渲染。

Backbone.Collection和我们平时接触的JAVA集合类相似,具有增加元素,删除元素,获取长度,排序,比较等一系列工具方法,说白了就是一个保存models的集合类。

Backbone.View中可以绑定dom el和客户端事件。页面中的html就是通过views的render方法渲染出来的,当新建一个view的时候通过要传进一个model作为数据,例如:

 



1. var view = new


 也就是说model就是以这种方式和view进行关联的。

 

特点

创建models或者views的语法:extends,相当于类继承

models的创建,销毁,校验等一系列改变都会触发相应的事件

 

示例

需求:用backbone.js和jquery实现一个可编辑的员工信息表格。

功能:1、录入员工信息。2、删除员工信息。3、双击表格可对员工信息进行修改。4、能对员工信息进行有效性校验。5、能对员工信息进行持久化。

设计:

用Employee类(继承自Backbone.Model)表示员工信息,包含ID、姓名、性别、年龄和职位字段。

 

1. window.Employee = Backbone.Model.extend({  
2. // 模型值校验
3. function(attrs){  
4. for(var key in
5. if(attrs[key] == ''){  
6. return key + "不能为空";  
7.             }  
8. if(key == 'age'
9. return "年龄必须是数字";  
10.             }  
11.         }  
12.     }  
13. });


声明Employee类之后就可以新增一个Employee的示例对象了:

 

1. var employee = new


 

Employee类中不必声明ID、姓名等业务字段。当需要给employee设置这些信息时候,只需要调用

 


1. employee.set({'id':1,'name':'Jason'});


 

当然,如果需要对employee的信息进行校验,需要给Employee类配置一个validate方法,这个方法的参数attrs就是set进去的json数据。这样,当employee里面的数据每次发生改变的时候都会先调用这个validate方法。

 

Model类定义好之后就可以开始定义集合类了,在集合类里面可以对里面的每个Model进行增加,删除等一系列操作,还可以调用fetch方法从server端获取集合的初始值。

 

1. window.EmployeeList = Backbone.Collection.extend({  
2.     model : Employee,  
3. // 持久化到本地数据库
4. new Store("employees"),  
5.       
6. });  
7. window.Employees = new


 

设置 localStorage属性后Employees里面的数据自动会同步保存到本地数据库里面,每当调用Employees.fetch()后又会从localStorage里面恢复数据。

 

View类主要负责一切和界面相关的工作,比如绑定html模板,绑定界面元素的事件,初始的渲染,模型值改变后的重新渲染和界面元素的销毁等:

 

1. window.EmployeeView = Backbone.View.extend({  
2. 'tr',  
3. '#item-template').html()),  
4.         events : {  
5. "dblclick td" : "edit",  
6. "blur input,select" : "close",  
7. "click .del" : "clear",  
8.         },  
9. function(){  
10. // 每次更新模型后重新渲染
11. this.model.bind('change', this.render, this);  
12. // 每次删除模型之后自动移除UI
13. this.model.bind('destroy', this.remove, this);  
14.         },  
15. function(){  
16. var model = this.model;  
17. this.input = $(this.el).find('input,select');   
18. this.input.each(function(){  
19. var input = $(this);  
20. "name")));  
21.             });  
22.         },  
23. function(e) {  
24. var
25. var
26. 'name')] = input.val();  
27. this.model.save(obj);  
28. "editing");  
29.         },  
30. function(e){  
31. // 给td加上editing样式
32. 'editing').find('input,select').focus();  
33.         },  
34. function() {  
35. this.el).html(this.template(this.model.toJSON()));  
36. // 把每个单元格的值赋予隐藏的输入框
37. this.setText();  
38. return this;  
39.         },  
40. function() {  
41. this.el).remove();  
42.         },  
43. function() {  
44. this.model.destroy();  
45.         }  
46.     });


 这个类里面的代码比较多,但主要和界面的渲染有关。一个EmployeeView对象对应table里面的一个tr元素。每次new一个EmployeeView对象的时候都会先调用initialize方法,这个方法里面绑定的事件确保了tr元素对应的model值每次发生改变或者被删除时都会同步到界面。也就是说当每次操作界面对数据进行修改后都是先把当前的变更保存到view绑定的model对象里面,然后model里面的事件机制会自动触发一个"change"事件对界面进行修改。

 

 

template中使用的方法_.template($('#item-template').html())是前面提到的underscore.js中提供一个工具方法,可以通过界面的HTML模板和一个JSON生成动态的HTML,说白了就是把JSON里面的值填充到HTML模板中对应的占位符里面去,牛X的是HTML模板里面支持一些常用的逻辑表达式如if,else,foreach等:

 

1. <script type="text/template" id="item-template">
2. <td><%= eid %></td>
3. <td class="username">
4. <div class="display"><%= username %></div>
5. <div class="edit"><input class="username" name="username"></input></div>
6. </td>
7. <td class="sex">
8. <div class="display"><%= sex=="1" ? "女":"男" %></div>
9. <div class="edit">
10. <select name="sex" class="sex" style="width:45px">
11. <option value="0">男</option><option value="1">女</option>
12. </select>
13. </div>
14. </td>
15. <td class="age">
16. <div class="display"><%= age %></div>
17. <div class="edit">
18. <input class="age" name="age"></input>
19. </div>
20. </td>
21. <td class="position">
22. <div class="display"><%= position %></div>
23. <div class="edit">
24. <input class="position" name="position"></input>
25. </div>
26. </td>
27. <td>
28. <a href="#" class="del">删除</a>
29. </td>
30. </script>


   

setText方法主要负责把model里面的数据设置到每个tr里面的隐藏输入域里面。

 

close方法被绑定到了input和select元素的blur事件中。当用户对单元格数据进行修改后都会把鼠标点击到界面其他地方然后输入框会自动隐藏并且把修改的数据显示在表格上面。close方法首先从当前被编辑的元素中拿到最新值,然后封装成一个对象,调用model的save方法后首先执行model的validate方法,如果校验通过则保存到本地存储并触发"change"事件。

 

最后还需要一个主界面View,这个View主要绑定了界面中的录入表单的“增加”按钮事件,Employees的相关事件以及页面初始化时从本地存储中恢复数据:

 

1. window.AppView = Backbone.View.extend({  
2. "#app"),  
3.         events : {  
4. "click .#add-btn" : "createOnEnter"
5.         },  
6. // 绑定collection的相关事件
7. function() {  
8. 'add', this.addOne, this);  
9. // 调用fetch的时候触发reset
10. 'reset', this.addAll, this);  
11.             Employees.fetch();  
12.         },  
13. function(e) {  
14. var employee = new
15. var
16. '#emp-form input,#emp-form select').each(function(){  
17. var input = $(this);  
18. 'name')] = input.val();  
19.             });  
20. 'error',function(model,error){  
21.                 alert(error);  
22.             });  
23. // set方法中会自动调用model的validate方法进行校验,如果不通过则返回false
24. if(employee.set(attr)){  
25.                 Employees.create(employee);  
26.             }  
27.         },  
28. function(employee){  
29. "eid":employee.get("eid")||Employees.length});  
30. 'error',function(model,error){  
31.                 alert(error);  
32.             });  
33. var view = new
34. ".emp-table tbody").append(view.render().el);  
35.         },  
36. function(){  
37. this.addOne);  
38.         }  
39.     });

 initialize方法中绑定了Employees的add和reset事件,也就是说每当往Employees中添加一个model的时候都会调用AppView的addOne方法,这个方法主要绑定了model的error事件以及把EmployeeView生成的html插入到界面中的合适位置。

 

OK,万事俱备,只欠启动,整个应用的初始化方法就是AppView的initialize方法,因此只需要新建一个AppView就可以了:

 

1. window.App = new

 

 

整个示例的JS代码很少,加上注释只有100行左右,感兴趣的可以下载看看。由于示例使用到了本地存储,所以不要用IE运行示例,你懂的

标签:function,backbone,js,employee,初探,var,input,model,方法
From: https://blog.51cto.com/u_16092550/6409964

相关文章

  • MES系统初探
    什么是MES系统MES系统是制造执行系统(ManufacturingExecutionSystem)的缩写,是一种用于监控、控制和优化制造过程的软件系统。它主要负责协调生产计划、生产调度、生产执行、质量管理、设备管理等方面的业务流程,实现生产过程的高效、精准和可控。MES系统通常与企业的ERP系统、SCAD......
  • nodejs守护进程 PM2
    概述PM2是用于Node.js应用程序的生产环境进程管理器,内置负载均衡器。它允许你将应用程序持续运行,无需停机重新加载,并简化常见的系统管理任务。官方网站Github特性进程管理:PM2可以启动、停止和重启Node.js应用程序进程,确保应用程序一直处于运行状态。它还提供了容错机制,......
  • Vue.js 状态管理库 Pinia
    概述Pinia是一个用于Vue.js应用程序的状态管理库。它是由VueStorefront团队开发的,旨在提供简单、可扩展且高效的状态管理解决方案。Pinia基于Vue3的新响应式系统,并通过使用TypeScript提供了强类型支持。它提供了一个类似于Vuex的API,但在某些方面更加简洁和直观。......
  • 打字动画 Typed.js
    概述Typed.js是一个JavaScript库,用于在网页上创建打字动画效果。它使您能够模拟打字机或逐字显示文本的效果,从而为用户提供逐渐展示文本的视觉体验。Typed.js提供了丰富的选项和配置,可以自定义打字动画的速度、暂停时间、删除效果等。您可以使用HTML元素或JavaScript调......
  • 模板引擎 Handlebars.js
    概述Handlebars.js是一个简单而强大的JavaScript模板引擎。它允许开发者通过定义模板和数据来生成动态的HTML页面。Handlebars.js基于Mustache模板语法,它提供了一些扩展和增强功能。并且开发者可以创建可重用的模板,并通过将数据传递给模板来生成最终的输出。这种分离数......
  • 使用 Node.js 连接 MySQL
    概述当使用Node.js开发Web应用程序时,经常需要与数据库进行交互来存储和检索数据。MySQL是一个流行的关系型数据库管理系统,它提供了强大的功能和性能。本文将介绍如何使用Node.js连接MySQL数据库,并展示一些常见的操作示例。开始在这里我们将使用Node.js的mysql2库来连......
  • c# xml、json相互转换
    stringjsonString="{\"Table\":{\"Row\":[{\"Name\":\"张三\",\"Age\":\"20\"},{\"Name\":\"李四\",\"Age\":\"25\"}]}}";......
  • json结构比较问题
    两个json字符串结构一样,但是单纯比较字符串不一样解决:fastjson2这个依赖亲测直接equals方法就可以比较出来,但是json得要JSON.parseObject或者parseArrary解析出来的对象,如果是自己造的对象,可以先转字符串再转对象......
  • 面试题:如何理解 JS的异步?
    JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个而渲染主线程承担着诸多的工作,渲染页面、执行JS都在其中运行。如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的主线......
  • 时间戳转化“刚刚”、“几小时前”、“几天前”、“几周前”等形式的js代码片段
    代码片段(可用于vue过滤器)functiongetTimeStr(timestamp){ constnow=newDate(); constdate=newDate(timestamp); constdiff=(now-date)/1000;//毫秒转换为秒 if(diff<60){   return"刚刚"; }elseif(diff<3600){   returnMath.f......