`

JavaScriptMVC之数据处理

阅读更多

常常,项目中创建,修改数据时,都会对前台提交的数据验证,转变。然后再提交给后台处理,这个步骤 是我们开发人员一定要完成的工作。在之前,我们在做数据验证或者转变时,都是把各种验证和数据转变都 写成各种函数放在工具文件中,让整个项目需要的地方调用。

那我们如果使用JavaScriptMVC开发Web项目时,也可以这样验证吗?答案是肯定的。但是,如果我们按之前 的方法来完成验证和转变,那真的是浪费了MVC框架了,它让我们写的验证和数据转变不现写在控制层,而是 把它放在了数据层,这样是不是更符合对象编程规范呢,而且阅读和维护起来更加方便快捷。

好了,讲了JavaScriptMVC的数据验证和转变的好处,下面让我们来一起学习在JavaScriptMVC中如何验证和转变 数据。

首先,我们来讲解我们最常用的验证,不管我们在那个项目都会完成这个工作,对于各种验证手法,想念大家都 也已经了解,在这里我不会大量的举例各种验证,我只是把JavaScriptMVC中它提供了那些工具,让我们更加方便 编写验证代码,而且全部满足我们平常的需求。

那JavaScriptMVC是自带验证功能的呢,查看了API,原来验证功能是JavaScriptMVC的
Model下面的一个模块validations, 就是它帮我们完成了一些常用的验证,而且还保留了给用户自定义验证的接口。 那Validations提供了那些常用验证函数,又是如何给用户提供自定义验证的接口呢?下面我们一一列出。

 

   /**
    * 函数 validateFormatOf
    * 
    * 验证属性值是否符合正则表达式
    * @param {Array|String} 属性或者属性组
    * @param {RegExp} 验证的正则表达式
    * @param {Object} 可选项,这里只提供2个特殊标识,message:自己错误信息,testIf:是否执行验证函数,返回true则执行,false,不执行
    * 例如:validateFormatOf(["name"],/(d+)/,{message:'不符合表达式',testIf:function(){return false;}});
    */
	
	
   /**
    * 函数 validateInclusionOf
    * 
    * 难属性值是否在给出的验证数组内
    * @param {Array|String} 属性或者属性组
    * @param {Array} 验证包含的数组
    * @param {Object} 可选项,这里只提供2个特殊标识,message:自己错误信息,testIf:是否执行验证函数,返回true则执行,false,不执行
    * 例如:validateInclusionOf(["name"],["lisi","test"],{message:'不在所给文本内',testIf:function(){return false;}});
    * 
    * 判断属性name的内容是否是lisi或者test,如果是,则返回正确,否则,返回错误信息
    * 
    */
   /**
    * 函数 validateLengthOf
    * 
    * 判断属性值文本的长度是否在给出的范围内
    * @param {Array|String} 属性或者属性组
    * @param {Number} 属性值文本最小长度
    * @param {Number} 属性值文本最小长度
    * @param {Object} 可选项,这里只提供2个特殊标识,message:自己错误信息,testIf:是否执行验证函数,返回true则执行,false,不执行
    * 例如:validateLengthOf(["name"],2,5,{message:'文本长度大于5或者小于2',testIf:function(){return false;}});
    * 
    */
   /**
    * 函数 validatePresenceOf
    * 
    * 属性值是否为空判断
    * Validates that the specified attributes are not blank.  See [jquery.model.validations validation] for more on validations.
    * @param 属性或者属性组
    * @param {Object} 可选项,这里只提供2个特殊标识,message:自己错误信息,testIf:是否执行验证函数,返回true则执行,false,不执行
    * 例如:validatePresenceOf(["name"],{message:'文本为空',testIf:function(){return false;}});
    *
    */
   /**
    * 函数 validateRangeOf
    *
    * 属性值大小是否在范围内
    * @param {Array|String} 属性或者属性组
    * @param {Number} 数值最小值
    * @param {Number} 数值最大值
    * @param {Object} 可选项,这里只提供2个特殊标识,message:自己错误信息,testIf:是否执行验证函数,返回true则执行,false,不执行
    * 例如:validatePresenceOf(["name"],2,5,{message:'数值小于2或者大于5',testIf:function(){return false;}});
    *
    *
    */

 以下是Validations提供5个常用验证函数,它们都是静态方法,可以在Model中直接调用 说完上面5个函数,我们发现怎么错误信息都是英文的,而且很简单,那能不能替换成自己的错误信息呢?


当然能,而且Validations提供了2种方式替换成自己的错误信息。

最直接一种就就是修改Validations这个属性:

validationMessages :{
    format:"is invalid",
    inclusion:"is not a valid option(perhaps out of range)",
    lengthShort:"is too short",
    lengthLong:"is too long",
    presence:"can't be empty",
    range:"is out of range";
}

上面这些信息就是5个函数提供的信息,我们可以替换成自己的错误信息。

另外一种就是在函数最后一个参数里传递我们自定义的错误信息。例如: this.validateLengthOf("description",2,5,{message:'自定义的错误信息';});至此,5个函数就讲完。

 

另外一种就是在函数最后一个参数里传递我们自定义的错误信息。例如: this.validateLengthOf("description",2,5,{message:'自定义的错误信息';});至此,5个函数就讲完。

最后一个就是给用户留下的自定义验证接口,当然我们也可以自己写自定义去完成上面5个函数的功能。

其实在我们很多项目中,用到最多的应该是这个函数,因为实际情况比较复杂,所以大多数都需要我们自己定义验证和返回自定义的错误信息。

最后我们看看Validations还给我们提供了一个跳过验证的选项,我们有时候测试的时候不想用到验证,但是我们又已经写了验证,是不是删除掉,然后要用的时候再加回来呢? 在这里完成不会,我们直接使用Validations提供的
一个选项testIf就可以达到这个目的,例如:

this.validateInclusionOf("date", ['test', 'aaaa'], {
			testIf : function() {
				return false;// 返回false,不对date验证,如果返回true,则验证;
			}
		});

 下面让我们让例子来实践:

//模型代码:

$.Model("Contact", {
	init : function() {
		this.validate("birthday", function() {
					if (this.birthday == null) {
						return "your birthday needs to be formatted YYYY-MM-DD";
					}
					if (this.birthday > new Date) {
						return "your birthday needs to be in the past";
					}
				});
		this.validateLengthOf("description", 2, 5, {
					message : '自定义的错误信息 '
				});
		this.validateInclusionOf("date", ['test', 'aaa'], {
					testIf : function() {
						return false;
					}
				});
	},
	attributes : {
		birthday : 'date',
		name : 'string'
	},
	findAll : "/contacts.json",
	update : "/contacts/{id;}.json"
}, {
	ageThisYear : function() {
		return new Date().getFullYear() - this.birthday.getFullYear();
	},
	getBirthday : function() {
		return "" + this.birthday.getFullYear() + "-"
				+ (this.birthday.getMonth() + 1) + "-"
				+ this.birthday.getDate();
	}
});	

 //控制器代码

$.Controller('Msgmanage.Message.Create', {
			init : function() {
				this.element.html(this.view());
			},
			submit : function(el, ev) {
				ev.preventDefault();
				this.element.find('[type=submit]').val('Creating...');
				var model = new Msgmanage.Models.Message(el.formParams());
				// 打印验证错误信息
				console.info(model.errors());
			},
			saved : function() {
				this.element.find('[type=submit]').val('Submit');
				this.element[0].reset();
			}
		});

 

 

数据格式转换(convert)

 

所谓数据格式转换,就是把同一个数据转换成不同的格式。
例如:日期的格式,有时候我们前台显示的日期格式是2010-12-12,但是后台响应给我们的格式是2012:12:12。这样就需要我们在显示数据之前,把数据转换过来。

在JavaScriptMVC中提供了2种方式:Setter和Convert。虽然2种方式,但是其它他们的作用域是不一样的,如果是一个很特殊的字段需要转换成一个很特殊的格式,那本人觉得使用Setter比较好,但是如果是一种类型的数据格式那使用Convert方式会更合理。

下面让我们介绍Setter:

// A contact model
$.Model("Contact", {
			findAll : "/contacts.json"
		}, {

			// 我们可以通过模型中的setter,转换出生日期的格式,我们可以看到,
			//使用Setter,只是在一个地方可以使用,不能给其它字段共用
			setBirthday : function(raw) {
				if (typeof raw == 'string') {
					var matches = raw.match(/(\d+)-(\d+)-(\d+)/)
					return new Date(matches[1], (+matches[2]) - 1, matches[3])
				} else if (raw instanceof Date) {
					return raw;
				}
			}
		});

 Convert:

$.Model("Contact", {
			attributes : {
				birthday : 'date'
			},
			convert : {
				// 使用convert,我们主要在属性里指定birthday的数据类型为date,
				//那么就是会调用到这个转换函数,如果其它字段也日期类型,那么,我们指定数据为date即可,
				// 从这里我们就可以看到,这个是可以公用的,但是我们也看到它的局限性,
				//它只能给这个模型使用,如果其它模型也想定义日期类型,是不是又得复制过去呢
				// 这样的作法明显不好,所以,我们还是回到正常的写法,把这个函数自定到工具类中,
				//然后在convert中调用,这样,我们就可以使用同一份代码了
				date : function(raw) {
					if (typeof raw == 'string') {
						var matches = raw.match(/(\d+)-(\d+)-(\d+)/)
						return new Date(matches[1], (+matches[2]) - 1,
								matches[3])
					} else if (raw instanceof Date) {
						return raw;
					}
				}
			}
		}, {// No prototype properties necessary
		})
 

最终的代码,定义一个工具类:

$.Class("Util", {
			valDate : function(raw) {
				if (typeof raw == 'string') {
					var matches = raw.match(/(\d+)-(\d+)-(\d+)/)
					return new Date(matches[1], (+matches[2]) - 1, matches[3])
				} else if (raw instanceof Date) {
					return raw;
				}
			}
		}, {});

 再在模型中调用这个工具的函数:

$.Model("Contact", {
			attributes : {
				birthday : 'date'
			},
			convert : {
				date : function(raw) {
					return Util.valDate(raw);
				}
			}
		}, {
		// No prototype properties necessary
		})

 至此,我们讲解数据处理就先讲到这里了。

0
0
分享到:
评论

相关推荐

    MVC框架 JavaScriptMVC.zip

    Controller作为Model和View之间的桥梁,接收用户的输入,调用Model进行数据处理,并通知View更新显示。 **Model** 在JavaScriptMVC中,Model类通常用于封装和管理数据。它提供了数据验证、事件触发等功能,确保数据...

    javascriptmvc-3.3.zip

    4. **Model**: JavaScriptMVC的模型层负责数据的管理和状态控制。在这个版本中,模型可能增强了数据同步和验证功能,使得与服务器的数据交互更加安全和可靠。 5. **Controller**: 控制器处理用户输入并协调视图和...

    javaScriptMVC 开源框架 第一部分

    7. **CanJS**: 是JavaScriptMVC中的核心库,提供了MVC结构的实现,包括数据绑定、依赖注入和事件处理等功能。 **应用场景** JavaScriptMVC适用于构建复杂、数据驱动的Web应用,如内容管理系统、电子商务平台等。...

    javascriptmvc-3.2.4.zip

    1. **模型(Model)**:模型层是应用的核心,负责处理数据和业务逻辑。在JavaScriptMVC中,模型类通过观察者模式与视图进行通信,当数据发生变化时,会自动通知视图更新。 2. **视图(View)**:视图负责展示数据,...

    从JavaScriptMVC开始如何完成项目之创建应用程序

    这篇博客文章“从JavaScriptMVC开始如何完成项目之创建应用程序”可能是指导开发者如何使用特定的JavaScript MVC框架或库来构建一个完整的应用程序。 在JavaScript MVC中: 1. **模型(Model)**:负责处理和管理...

    javascriptmvc

    它们处理数据的验证、存储和检索。模型的变化会触发视图的更新,确保用户界面始终反映出最新的数据状态。 **视图(View)** 视图是用户与应用程序交互的界面部分,通常由HTML、CSS和JavaScript组成。视图负责显示...

    从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档

    在“从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档”这个主题中,我们将探讨如何利用该框架进行项目开发,特别是涉及到的压缩文件处理和生成帮助文档这两个关键环节。 一、压缩文件 在项目开发中,压缩...

    JavascriptMVC代码

    在这个架构中,Model负责数据处理,View负责用户界面展示,而Controller作为两者之间的桥梁,处理用户交互并更新模型或视图。 在JavaScript MVC框架中,常见的有AngularJS、Ember.js、Backbone.js等。这些框架提供...

    谈谈JavaScriptMVC模式共3页.pdf.zip

    模型层是应用程序的核心,负责处理数据和业务逻辑。在JavaScript MVC中,Model通常用来存储和操作后端服务器返回的数据。当数据发生变化时,Model会触发事件通知其他组件,保持数据的一致性。例如,一个用户列表...

    JavaScriptMVC:JavaSriptMVC 高级编程课程

    在JavaScriptMVC中,模型处理数据和业务逻辑,视图负责展示数据,而控制器则协调模型和视图之间的交互。 2. **jQuery和JavaScriptMVC的关系** JavaScriptMVC基于jQuery库,利用jQuery的强大DOM操作和事件处理能力...

    javaScriptMVC 开源框架 第三部分(相关资料和例子)

    模型处理数据和业务逻辑,视图负责用户界面的展示,而控制器协调模型和视图之间的交互。 2. **JavaScript MVC框架**:介绍一些流行的JavaScript MVC框架,如AngularJS、Ember.js、Backbone.js等,它们是如何实现MVC...

    javaScriptMVC 开源框架 第二部分

    首先,MVC模式是软件工程中的一个经典设计模式,它将应用分为三个主要部分:Model(模型)负责处理数据和业务逻辑,View(视图)负责展示数据,而Controller(控制器)作为两者之间的桥梁,处理用户交互并更新模型或...

    100行代码实现的JavaScriptMVC样式框架

    这些框架实现了MVC,使得在一个单页面中实现根据需要变化视图时更加轻松,而模型-视图-控制器(mvc)的核心概念就是:处理传入请求的控制器、显示信息的视图、表示业务规则和数据访问的模型。因此,当需要创建这样一...

    MVC的JavaScript Web富应用开发(完整版)

    揭开MVC的神秘面纱,教你如何设计合理的架构以及处理应用内部模块之间的依赖 介绍模板引擎和数据绑定 讲解远程数据加载、第二代Ajax以及跨域请求 利用WebSockets和Node构建实时应用 拖拽上传文件以及上传进度...

    前端MVC的应用.pdf

    它管理应用程序的数据状态,处理CRUD操作,响应数据查询,并对数据进行验证。在JavaScript应用程序中,模型可以使用JSON来表示数据,并使用AJAX来存取数据。现在很多JavaScript库像Dojo、ExtJS都有专门的Data包,...

    基于MVC的JavaScript Web富应用开发

    , 揭开MVC的神秘面纱,教你如何设计合理的架构以及处理应用内部模块之间的依赖, 介绍模板引擎和数据绑定, 讲解远程数据加载、第二代Ajax以及跨域请求, 利用WebSockets和Node构建实时应用, 拖拽上传文件以及上传进度...

    jQuery应用程序架构设计工具

    - **Backbone.js**:非常流行的MVC库之一,提供了一个强大的数据绑定系统以及丰富的视图管理机制。 - **Spine.js**:一个简单易用的MVC框架,特别适合小型项目。 - **Sammy.js**:专注于单页面应用的轻量级MVC框架,...

    8大流行JS框架 10大新的最具潜力JS框架

    3. **JavaScriptMVC**:JavaScriptMVC是一个完整的MVC框架,包含Model、View、Controller、ORM、测试工具等,旨在提高开发效率和代码质量。 4. **Qooxdoo**:Qooxdoo是一个全方位的JavaScript开发框架,提供编译器...

    AngularJS-下一个大框架

    具有数据绑定,MVW,MVVM,MVC,依赖注入的声明式模板和出色的可测试性都是用纯客户端JavaScript来实现的!AngularJS是一个创建富客户端应用的JavaScriptMVC框架,它组织良好,经过严格测试,多功能,强大并且十分灵活。你...

Global site tag (gtag.js) - Google Analytics