将Ember-Data与RestAdapter一起使用,我能够成功从我的服务器获取数据。我使用Handlebar的{{input}}帮助器显示这些数据。用例相对简单:我想允许用户更新数据,并将修改保留回服务器。
以下是我的问题:
1)当我修改屏幕上显示的数据时,一旦我跳出某个特定的字段,Ember-Data“store”会自动在场景后面更新吗?
2)在监视服务器传入的消息时,当我选择一个字段或者我改变路由时,我看不到来自Ember的http“PUT”请求。那么我该如何触发对服务器的更新呢?
根据Amir的回答,我让RestAdapter通过使用“this.get('model')向服务器发送”PUT“请求.save();”。但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记录?
答案 0 :(得分:0)
您可以通过调用模型上的save
(可能来自控制器)来决定何时将对象(到服务器)持久化。
请注意,此时ember-data尚未准备就绪,但对于您的简单情况,它应该没问题: - )
这是显示保存新记录的fiddle。在chrome检查器中,您可以看到它执行GET和POST。如果你已经加载了一条记录并点击了保存,它就会做一个PUT。
当RESTAdapter将对象序列化为JSON时,它会遍历所有属性。如果属性是关系,则它们可能尚未完成,并且可能不会发送到后端。 (或者以undefined
)发送到后端;
当我需要保存关系时(特别是如果它是异步的)我已经将保存包装在get中以确保数据准备就绪。
strat.get('items').then(function(){
strat.save(); //at this point items is populated
})
我确信有更好的方法可以做到这一点,并乐意学习它!
答案 1 :(得分:0)
Serializer,带有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 }
}
替代方案是通过插件Ember-CLI Stained By Children,它是Mixins的集合,用Child Model数据解决了这个问题。我也喜欢这个名称:孩子们的染色和干净的儿童!适合这种困境!