服务器更新时使用Ember Data RestAdapter
使用Ember-Data和RestAdapter,我可以成功地从我的服务器获取数据。 我使用Handlebar的{{input}}助手显示这些数据。 用例相对简单:我想让用户更新数据,并将修改保留回服务器。
这是我的问题:
1)当我修改屏幕上显示的数据时,一旦我从特定字段中退出,Ember-Data“store”会自动在场景后更新?
2)在监视服务器传入消息时,当我退出某个字段或更改路由时,我看不到来自Ember的http“PUT”请求。 那么我该如何去触发服务器的更新呢?
后续评论
Per Amir的回答如下,我让RestAdapter通过使用“this.get('model')。save();”向服务器发送一个“PUT”请求。 但RestAdapter没有发送hasMany记录。 因此,如果我的模型定义如下所示(请注意'item'和'strat'都有ID,这些ID在模型定义中未显示):
App.Item = DS.Model.extend({
itemName: DS.attr('string'),
strategy: DS.belongsTo('strat')
});
App.Strat = DS.Model.extend({
stratName: DS.attr('string'),
items: DS.hasMany('item',{async:true})
});
“this.get('model')。save()”触发了一个“PUT”请求到服务器,但发送的JSON只包含了stratName。 如何让RestAdapter发送hasMany记录?
您可以通过调用save
模型(可能来自控制器)来决定何时将对象save
到服务器。
请注意,此时ember-data不是生产准备好的,但对于简单的情况,它应该没问题:-)
这是一个小提琴,显示保存一个新的纪录。 在铬检查器,你可以看到它做了一个GET和POST。 如果你有一个记录已经加载并保存,它会做一个PUT。
节省有很多
当RESTAdapter将对象序列化为JSON时,它会遍历所有属性。 如果这些属性是关系,它们可能还没有实现,并且可能不会被发送到后端。 (或者以undefined
方式发送到后端);
当我需要保存关系时(特别是如果它是异步的),我一直在保存中保存数据以确保数据准备就绪。
strat.get('items').then(function(){
strat.save(); //at this point items is populated
})
我确信有更好的方法来做到这一点,并很乐意学习它!
选项1
串行器,与DS.EmbeddedRecordsMixin:
attrs: {
// if the kids are embedded to and from server:
childAttribute: { embed: 'always' },
// if sending the kids with data to the server:
childAttTwo: { serialize: 'records', deserialize: false }
}
选项2
另一种方法是通过一个插件Ember-CLI Stained By Children,它是一个Mixin集合,它用Child Model数据解决了这个问题。 我也喜欢这个命名法:染色的孩子和干净的嵌入式孩子! 所以适合这种困境!
链接地址: http://www.djcxy.com/p/90953.html