英文原版:https://guides.emberjs.com/v2.14.0/models/defining-models/
模型,是一个定义了交互数据中的属性和行为的一个类,并且通过模型来向用户展示内容。任何用户希望看到的内容都应该用model来代表。
当你需要创建一个新的模型时,你需要在models文件夹下面创建一个新的文件,并且这个新的模型要从DS.Model类继承。用Ember CLI命令来创建模型可以为你省不少时间。下面我们来创建一个person模型:
ember generate model person
将会生成person.js:
app/models/person.js
import DS from 'ember-data';
export default DS.Model.extend({
});
待你创建了模型类后,你就可以开始查询指定类型的记录了。
定义属性
上面定义的person模型还没有包含任何属性。现在我们给它添加firstName、lastName和birthday属性:
app/models/person.js
import DS from 'ember-data';
export default DS.Model.extend({
firstName: DS.attr(),
lastName: DS.attr(),
birthday: DS.attr()
});
模型中的属性将会在从服务端返回的数据转换为记录时和序列化一条记录保存到服务器时被使用。
你可以像使用其他属性那样来使用模型中的属性,包括使用计算属性。经常的,你会需要定义计算属性来做一些基于模型中其他属性的属性。
app/models/person.js
import DS from 'ember-data';
export default DS.Model.extend({
firstName: DS.attr(),
lastName: DS.attr(),
fullName: Ember.computed('firstName', 'lastName', function() {
return `${this.get('firstName')} ${this.get('lastName')}`;
})
});
更多关于计算属性的内容,请查阅:计算属性
转换器
在前后台交互过程中,有可能服务端返回的数据的数据类型跟你在javascript代码中所使用的类型不一致。Ember Data允许你定义简单的序列化和反序列化方法来对这些属性的类型做转换。你可以指定你想要的数据类型做为第一个参数给DS.attr( )方法。Ember Data提供了一些类型:string,number,boolean和date。
app/models/person.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
age: DS.attr('number'),
admin: DS.attr('boolean'),
birthday: DS.attr('date')
});
date 转换器,将会把一个 ISO 8601标准的日期字符串转换为javascript date对象。
boolean转换器,除了布尔值true和false之外,它还能处理其他类型的值。字符串”true”或”t”或者其他任何字符串以及”1”或者数字都会被转换为true。
转换器不是必须使用的。如果你不指定转换器,那么Ember data不会对值做其他操作(默认:string)。
自定义转换器
你也可以创建一个自定义转换器:
ember generate transform dollars
下面是一个简单的转换器,它将数值在美分和美元之间做转换:
app/transforms/dollars.js
import DS from 'ember-data';
export default DS.Transform.extend({
deserialize: function(serialized) {
return serialized / 100; // returns dollars
},
serialize: function(deserialized) {
return deserialized * 100; // returns cents
}
});
转换器带有2个方法:serialize和deserialize。反序列化将值转换为客户端需要的形式。序列化将值还原成原始的形式。
你可以这么使用你的自定义转换器:
app/models/product.js
import DS from 'ember-data';
export default DS.Model.extend({
spent: DS.attr('dollars')
});
设置项(Options)
DS.attr( ) 也可以带有第二个参数,形式为{ }对象。目前设置项只有defaultValue可用,可以用它来设置模型中该属性的默认值。可以直接使用一个值,也可以通过函数来设置默认值。
下面的例子我们定义了一个verified属性,它的默认值是false, createdAt的默认值时当前的日期时间。
app/models/user.js
import DS from 'ember-data';
export default DS.Model.extend({
username: DS.attr('string'),
email: DS.attr('string'),
verified: DS.attr('boolean', { defaultValue: false }),
createdAt: DS.attr('date', {
defaultValue() { return new Date(); }
})
});
本节完