当前位置:K88软件开发文章中心编程语言JavaScriptEmber.js → 文章内容

Ember 自定义序列号器

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 15:27:11

据ID属性每一条数据都有一个唯一值作为ID,默认情况下Ember会为每个模型加上一个名为id的属性。如果你想改为其他名称,你可以在序列化器中指定。// app/serializers/application.jsimport DS from 'ember-data';export default DS.JSONSerializer.extend({ primatyKey: '__id'});把数据主键名修改为__id。5,属性名Ember Data约定的属性名是驼峰式的命名方式,但是序列化器却期望的是中划线分隔的命名方式,不过Ember会自动转换,不需要开发者手动指定。然而,如果你想修改这种默认的方式也是可以的,只需在序列化器中使用属性keyForAttributes指定你喜欢的分隔方式即可。比如下面的代码把序列号的属性名称改为以下划线分隔:// app/serializers/application.jsimport DS from 'ember-data';export default DS.JSONSerializer.extend({ keyForAttributes: function(attr) { return Ember.String.underscore(attr); }});6,指定属性名的别名如果你想模型数据被序列化、反序列化时指定模型属性的别名,直接在序列化器中使用attrs属性指定即可。// app/models/person.jsexport default DS.Model.extend({ lastName: DS.attr(‘string’)});指定序列化、反序列化属性别名:// app/serializers/application.jsimport DS from 'ember-data';export default DS.JSONSerializer.extend({ attrs: { lastName: ‘lastNameOfPerson’ }});指定模型属性别名为lastNameOfPerson。7,模型之间的关联关系一个模型通过ID引用另一个模型。比如有两个模型存在一对多关系:// app/models/post.jsexport default DS.Model.extend({ comments: DS.hasMany(‘comment’, { async: true });});序列化后JSON数据格式如下,其中关联关系通过一个存放ID属性值的数组实现。{ "data": { "type": "posts", "id": "1", "relationships": { "comments": { "data": [ { "type": "comments", "id": "5" }, { "type": "comments", "id": "12" } ] } } }}可见,有两个comment关联到一个post上。如果是belongsTo关系的,JSON结构与hadMany关系相差不大。{ "data": { "type": "comment", "id": "1", "relationships": { "original-post": { "data": { "type": "post", "id": "5" }, } } }}id为1的comment关联了ID为5的post。8,自定义转换规则在某些情况下,Ember内置的属性类型(string、number、boolean、date)还是不够用的。比如,服务器返回的是非标准的数据格式时。Ember Data可以注册新的JSON转换器去格式化数据,可用直接使用命令创建:ember g transform coordinate-point// app/transforms/coordinate-point.jsimport DS from 'ember-data';export default DS.Transform.extend({ deserialize: function(v) { return [v.get('x'), v.get('y')]; }, serialize: function(v) { return Ember.create({ x: v[0], y: v[1]}); }});定义一个复合属性类型,这个类型由两个属性构成,形成一个坐标。// app/models/curor.jsimport DS from 'ember-data';export default DS.Model.extend({ position: DS.attr(‘coordinate-point’)});自定义的属性类型使用方式与普通类型一致,直接作为attr方法的参数。最后当我们接受到服务返回的数据形如下面的代码所示:{ cursor: { position: [4, 9] }}加载模型实例时仍然作为一个普通对象加载。仍然可以使用.操作获取属性值。var cursor = this.store.findRecord(‘cursor’, 1);cursor.get(‘position.x’); // => 4cursor.get(‘position.y’); // => 99,JSONSerializer并不是所有的API都遵循JSONAPISerializer约定通过数据命名空间和拷贝关系记录。比如系统遗留问题,原先的API返回的只是简单的JSON格式并不是JSONAPISerializer约定的格式,此时你可以自定义序列化器去适配旧接口。并且可以同时兼容使用RESTAdapter去序列号这些简单的JSON数据。// app/serializer/application.jsexport default DS.JSONSerializer.extend({ // ...});10,EMBEDDEDRECORDMIXIN尽管Ember Data鼓励你拷贝模型关联关系,但有时候在处理遗留API时,你会发现你需要处理的JSON中嵌入了其他模型的关联关系。不过EmbeddedRecordsMixin可以帮你解决这个问题。比如post中包含了一个author记录。{ "id": "1", "title": "Rails is omakase", "tag": "rails", "authors": [ { "id": "2", "name": "Steve" } ]}你可以定义里的模型关联关系如下:// app/serializers/post.jsexport default DS.JSONSerialier.extend(DS.EmbeddedRecordsMixin, { attrs: {author: { serialize: ‘records’, deserialize: ‘records’} }});如果你发生对象本身需要序列化与反序列化嵌入的关系,你可以使用属性embedded设置。// app/serializers/post.jsexport default DS.JSONSerialier.extend(DS.EmbeddedRecordsMixin, { attrs: {author: { embedded: ‘always’ } }});序列化与反序列化设置有3个关键字:records 用于标记全部的记录都是序列化与反序列化的ids 用于标记仅仅序列化与反序列化记录的idfalse 用于标记记录不需要序列化与反序列化例如,你可能会发现你想读一个嵌入式记录提取时一个JSON有效载荷只包括关系的身份在序列化记录。这可能是使用serialize: ids。你也可以选择通过设置序列化的关系 serialize: false。export default DS.JSONSerializer.extend(DS.EmbeddedRecordsMixin, { attrs: { author: { serialize: false, deserialize: 'records' }, comments: { deserialize: 'records', serialize: 'ids' } }});11,EMBEDDEDRECORDSMIXIN 默认设置如果你没有重写attrs去指定模型的关联关系,那么EmbeddedRecordsMixin会有如下的默认行为:belongsTo:{serialize: ‘id’, deserialize: ‘id’ }hasMany: { serialize: false, deserialize: ‘ids’ }12,创作序列化器如果项目需要自定义序列化器,Ember推荐扩展JSONAIPSerializer或者JSONSerializer来实现你的需求。但是,如果你想完全创

上一页  [1] [2] [3]  下一页


Ember 自定义序列号器