代码改变世界

Sencha Touch 数据层篇 Model

2011-12-07 10:10  威老  阅读(6514)  评论(1编辑  收藏  举报

模型 model

一个最基本的模型声明其所代表的数据对象所具有的字段名称。复杂一点的,可以再加入一些字段类型的声明、字段的验证规则、字段的映射。

定义模型

定义一个模型非常简单:继承“Ext.data.Model”,然后给他指定一些字段就行了。

最简单的模型甚至连字段类型都不需要声明,这时的每个字段都是一个简单的字符串:

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: ['name',  'age', ' phone',  'alive']
});

也可以给模型的每个字段声明类型,这时每个字段都是一个包含两个属性的对象,就像这样:

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'name',  type: 'string'},
        {name: 'age',   type: 'int'},
        {name: 'phone', type: 'string'},
        {name: 'alive', type: 'boolean', defaultValue: true}
    ]
});

添加验证规则

Ext.data.Model类提供了模型的验证支持,通过配置validation可为模型添加验证规则。

Ext.define('User', {
	extend: 'Ext.data.Model',
	fields: [
		{name: 'name',		type: 'string'},
		{name: 'age',		type: 'int'},
		{name: 'phone',		type: 'string'},
		{name: 'gender',	type: 'string'},
		{name: 'username',	type: 'string'},
		{name: 'alive',		type: 'boolean', defaultValue: true}
	],
	validations: [
		{type: 'presence',	field: 'age'},
		{type: 'length',	field: 'name',		min: 2},
		{type: 'inclusion',	field: 'gender',	list: ['Male', 'Female']},//枚举型,值必须在list中。
		{type: 'exclusion',	field: 'username',	list: ['Admin', 'Operator']},
		{type: 'format', 	field: 'username',	matcher: /([a-z]+)[0-9]{2,3}/}//值必须匹配正则表达式
	]
});

配置了验证规则后,就可以使用validatie()方法就会返回一个包含错误信息的Ext.data.Errors对象。通过这个对象,我们可以知道,有哪些字段出了错误,出了哪些错误。下面是使用validate()方法的示例:

var instance = Ext.create('User', {
	name: 'Ed',
	gender: 'Male',
	username: 'edspencer'//这里username不符合规则
});
var errors = instance.validate();
console.log(errors.isValid());//存在错误输出"false"
console.log(errors.length);//有一个错误,输出“1”
console.log(errors.getByField('name'));//没有错误输出空数组“[]”
console.log(errors.getByField('gender'));//没有错误输出空数组“[]”
console.log(errors.getByField('username'));//[{field: "username",message: "is the wrong format"}]

关系型数据模型

一个复杂的数据可以用多个数据模型来表示。使用belongsTo配置项来声明这个模型是属于另一个模型的;使用hasMany配置项,声明这个模型的数组类型字段。

Ext.define('Post', {
	extend: 'Ext.data.Model',
	fields: ['id', 'user_id'],
	belongsTo: 'User',
	hasMany: {//使用hasMany配置项,声明这个模型的数组类型字段。
		model: 'Comment',
		name: 'comments'
	}
});
Ext.define('Comment', {
	extend: 'Ext.data.Model',
	fields: ['id', 'user_id', 'post_id'],
	belongsTo: 'Post'//使用belongsTo配置项,声明这个模型从属于另一个模型
});


Ext.define('User', {
	extend: 'Ext.data.Model',
	fields: ['id'],	
	hasMany: ['Post', {
		model: 'Comment',
		name: 'comments'
	}]
});

使用association配置项也能实现hasMany功能。

Ext.define('User', {
	extend: 'Ext.data.Model',
	fields: ['id'],
	associations: [//使用association,要用type配置关系类型
		{type: 'hasMany', model: 'Post',    name: 'posts'},
		{type: 'hasMany', model: 'Comment', name: 'comments'}
	]
});

OK,今天就到此为止。下一篇威老将会为大家介绍Sencha Touch数据层中的另一个关键类:Ext.data.Store。