`

Backbone 可编辑表格实现

 
阅读更多

 

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

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

设计:

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

 

window.Employee = Backbone.Model.extend({
	// 模型值校验
	validate:function(attrs){
		for(var key in attrs){
			if(attrs[key] == ''){
				return key + "不能为空";
			}
			if(key == 'age' && isNaN(attrs.age)){
				return "年龄必须是数字";
			}
		}
	}
});

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

 

 

var employee = new Employee();

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

 

 

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

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

 

 

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

 

window.EmployeeList = Backbone.Collection.extend({
	model : Employee,
	// 持久化到本地数据库
	localStorage: new Store("employees"),
	
});
window.Employees = new EmployeeList();

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

 

在这个插件里重写了CRUD的方法,存储的格式为key--storename, value--{},然后所有的数据都是存储在对象{}里。

 

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

 

window.EmployeeView = Backbone.View.extend({
	tagName : 'tr',
	template : _.template($('#item-template').html()),
	events : {
		"dblclick td" : "edit",
		"blur input,select" : "close",
		"click .del" : "clear",
	},
	initialize : function(){
		// 每次更新模型后重新渲染
		this.model.bind('change', this.render, this);
		// 每次删除模型之后自动移除UI
		this.model.bind('destroy', this.remove, this);
	},
	setText : function(){
		var model = this.model;
		this.input = $(this.el).find('input,select'); 
		this.input.each(function(){
			var input = $(this);
			input.val(model.get(input.attr("name")));
		});
	},
	close: function(e) {
		var input = $(e.currentTarget);
		var obj = {};
		obj[input.attr('name')] = input.val();
		this.model.save(obj);
		$(e.currentTarget).parent().parent().removeClass("editing");
        },
	edit : function(e){
		// 给td加上editing样式
		$(e.currentTarget).addClass('editing').find('input,select').focus();
	},
	render: function() {
	    $(this.el).html(this.template(this.model.toJSON()));
	    // 把每个单元格的值赋予隐藏的输入框
	    this.setText();
	    return this;
        },
        remove: function() {
            $(this.el).remove();
        },
        clear: function() {
             this.model.destroy();
        }
});

这个类里面的代码比较多,但主要和界面的渲染有关。一个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等:

 

    <script type="text/template" id="item-template">
	<td><%= eid %></td>
	<td class="username">
		<div class="display"><%= username %></div>
		<div class="edit"><input class="username" name="username"></input></div>
	</td>
	<td class="sex">
		<div class="display"><%= sex=="1" ? "女":"男" %></div>
		<div class="edit">
		<select name="sex" class="sex" style="width:45px">
			<option value="0">男</option><option value="1">女</option>
		</select>
		</div>
	</td>
	<td class="age">
		<div class="display"><%= age %></div>
		<div class="edit">
			<input class="age" name="age"></input>
		</div>
	</td>
	<td class="position">
		<div class="display"><%= position %></div>
		<div class="edit">
			<input class="position" name="position"></input>
		</div>
	</td>
	<td>
		<a href="#" class="del">删除</a>
	</td>
</script>

 setText方法主要负责把model里面的数据设置到每个tr里面的隐藏输入域里面, 这样双击编辑的时候会有默认值存在。

 

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

 

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

window.AppView = Backbone.View.extend({
	el : $("#app"),
	events : {
		"click .#add-btn" : "createOnEnter"
	},
	// 绑定collection的相关事件
	initialize: function() {
	        Employees.bind('add', this.addOne, this);
	        // 调用fetch的时候触发reset
	        Employees.bind('reset', this.addAll, this);
	        Employees.fetch();
	 },
	 createOnEnter : function(e) {
	    	var employee = new Employee();
	    	var attr = {};
	    	$('#emp-form input,#emp-form select').each(function(){
	    		var input = $(this);
	    		attr[input.attr('name')] = input.val();
	    	});
	    	employee.bind('error',function(model,error){
	    		alert(error);
	    	});
    		// set方法中会自动调用model的validate方法进行校验,如果不通过则返回false
    		if(employee.set(attr)){
    			Employees.create(employee);
    		}
	},
        addOne : function(employee){
        	employee.set({"eid":employee.get("eid")||Employees.length});
        	employee.bind('error',function(model,error){
        		alert(error);
        	});
        	var view = new EmployeeView({model:employee});
        	$(".emp-table tbody").append(view.render().el);
        },
        addAll : function(){
        	Employees.each(this.addOne);
        }
});

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

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

window.App = new AppView();

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    backbone学习例子-可编辑的表格

    在可编辑表格的场景下,集合可能是整个表格的数据源,它可以管理模型的添加、删除和排序,并且可以监听模型的变化。 3. **视图(View)**:视图负责渲染模型的数据到DOM,并响应用户的交互。在这个例子中,每个视图...

    backbone教程

    使用Backbone.js和jQuery实现一个可编辑的员工信息表格。功能包括: 1. 录入员工信息 2. 删除员工信息 3. 双击表格可对员工信息进行修改 4. 能对员工信息进行有效性校验 5. 能对员工信息进行持久化 设计: * 用...

    用Backbone.js写的小项目

    Backbone.js是一款轻量级的JavaScript库,专为构建可维护性和结构化的Web应用程序而设计。它主要关注数据模型的管理、视图的渲染以及事件处理,为前端开发者提供了一套MVC(Model-View-Controller)架构模式的实现。...

    BackgridEditor:Backbone-form 的 Backgrid 编辑器

    BackgridEditor提供了一个可编辑表格的实现方式。 当然,Backbone-forms已经提供了editor.List,可以用于管理数据中的数组元素。并提供增、删、改功能。 正如Backbone-forms与Backgrid组件的区别,editor.List与...

    backbone-form-uploader:主干表单的上传文件编辑器

    骨干表格上传器当前版本 0.1 一个自定义编辑器,集成了用于 Backbone.js 应用程序的灵活、可定制的表单框架的backbone-forms.js的 。 具有相同的依赖关系演示你可以在这里找到一个工作示例:目的特征去做

    backbone-showcase-on-rails

    骨干展示柜 展示柜是一个不错的单页应用程序,可让您跟踪所看的节目及其收视率。... 添加一个“编辑”按钮,该按钮可使表格显示在节目卡上,其中的字段与节目的标题,流派和星号相对应。 提交该表单后,应保留该表

    grifotv-portfolio:我的作品集是使用Sublime,CoffeeScript,Backbone.js,jQuery Isotope,Paper.js和Google Docs电子表格作为CMS开发的

    开发者运用了一系列现代Web技术,如CoffeeScript和Backbone.js来构建动态界面,jQuery Isotope处理网格布局,Paper.js实现动画效果,并利用Google Sheets作为内容管理的解决方案。项目还可能涉及Java技术来支持后端...

    前端项目-backgrid.js.zip

    4. **Extensions**: Backgrid.js社区提供了许多扩展,如CellEditors(单元格编辑器)、Form(表单)、SelectRow(选择行)等,进一步增强了表格的功能。 **四、集成与使用** Backgrid.js易于与其他前端框架和库...

    FormCraft:Rails&Backbone.js中的表单构建器应用程序

    后端是在Ruby on Rails中构建的,而“表单编辑器”是一个单页Backbone.js应用程序。 测试是在RSpec中完成的,并且该应用程序是通过Heroku部署的。 入门 发展 克隆Git存储库或下载为ZIP。 导航到终端中的FormCraft...

    Backgrid.Extensions

    这个库旨在帮助开发者在Web应用中创建复杂、可定制的数据展示表格。Backbone.js是一款轻量级的MVC(模型-视图-控制器)框架,而Backgrid.Extensions则是其功能的增强版,提供了一系列强大的特性来提升数据管理的效率...

    SpreadSheetViewer:HTML Web 应用程序中的 SpreadSheetViewer (.csv)

    SpreadSheetViewer 是使用backbone.js ( ) 框架的Web 应用程序,顾名思义,该应用程序用于查看电子表格。 目前,它仅支持 csv 文件。 它有两个并排显示的视图 第一个视图,包含一个电子表格,应用程序为此使用 ...

    matlab批量替换代码-made-in-serbia:in在塞尔维亚进行的整洁项目清单

    任何人都可以得到美观,结构良好,高度可定制,可访问和可用的表格。 简而言之:它使开发人员的生活更加轻松。 支持→ 70 / Apy是一个简单的客户端库,用于进行rest api ajax调用。 40 / jQuery在线CSS编辑器,...

Global site tag (gtag.js) - Google Analytics