Ember多维数组,模型数据的最佳实践

时间:2016-06-28 21:24:28

标签: arrays ember.js ember-data

通常在Ember中,您可以设置模型:

export default Model.extend({
    "name": attr('string'),
    "address": attr('string'),
    "sports": attr()
})

然后创建一个表单:

{{input value=name}}
{{input value=address}}
{{input value=sports}}

从那里你可以得到输入值或设置值:

var name_val = this.get('name');
var address_val = this.get('address');
var sports_val = this.get('sports');

或设置值:

this.set('address','123 Main Street');

如何创建动态多维数组并存储它们?例如,您想要列出几项运动:

{{input type="checkbox" name="baseball" checked=baseball.isChecked}} 
{{input type="checkbox" name="football" checked=football.isChecked}} 
{{input type="checkbox" name="hockey" checked=hockey.isChecked}}

从那里你可能想知道一项运动检查,用户是否观看该运动,或者参加这项运动?这可以使用下拉列表或更多复选框来完成。最终,最终结果将是这个json:

{
    'name':  'Matt',
    'address': '123 Main Street',
    'sports': {
        'baseball': 'watch',
        'hockey': 'play'
    }

}

似乎Ember很容易设置一个级别的项目,但是多个动态值和级别呢?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我建议使用hasMany关系。它会使事情变得更加灵活,例如,如果你想添加更多与这项运动相关的属性,你可以轻松地做到这一点:

//user.js
import DS from 'ember-data';
export default Model.extend({
    "name": DS.attr('string'),
    "address": DS.attr('string'),
    "sports": DS.hasMany('sport')
})

//sport.js
import DS from 'ember-data';
export default Model.extend({
    "name": DS.attr('string'),
    "play": DS.attr('boolean'),
    "watch": DS.attr('boolean')
});

由于我们希望嵌入有效负载,我们可以使用嵌入式记录mixin:

//serializers/user.js
import DS from 'ember-data';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    sports: { embedded: 'always' }
  }
}); 

具有此结构的默认有效负载如下所示:

{users:[
{
    'id':1,
    'name':  'Matt',
    'address': '123 Main Street',
    'sports': [
        {'id':1, 'name':'baseball', 'watch':true, 'play':false},
        {'id':2, 'name':'hockey', 'watch':true, 'play':true}
    ]

}
]}

但是如果你绝对需要有效载荷看起来像你拥有的那样,那么你可能想要深入研究序列化器(http://emberjs.com/api/data/classes/DS.RESTSerializer.html),特别是“规范化”以将数据提供给客户端,格式为ember数据理解然后“序列化”以更改数据以您要存储的格式发送到服务器。