2

将 Ember-Data 与 RestAdapter 一起使用,我能够成功地从我的服务器获取数据。我使用 Handlebar 的 {{input}} 助手显示这些数据。用例相对简单:我想让用户更新数据,并将修改持久化回服务器。

以下是我的问题:

1)当我修改屏幕上显示的数据时,Ember-Data“存储”是否会在我退出特定字段后自动更新?

2) 在监视服务器传入消息时,当我从字段中跳出或更改路由时,我看不到来自 Ember 的 http“PUT”请求。那么我该如何去触发对服务器的更新呢?

后续评论

根据 Amir 在下面的回答,我让 RestAdapter 使用“this.get('model').save();”向服务器发送“PUT”请求。但是 RestAdapter 没有发送 hasMany 记录。因此,如果我的模型定义如下所示(请注意,“item”和“strat”都有 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 记录?

4

2 回答 2

0

save您可以通过调用模型(可能来自控制器)来决定何时将对象持久化(到服务器)。

请注意,此时 ember-data 尚未准备好生产,但对于您的简单情况,它应该没问题:-)

这是一个显示保存新记录的小提琴。在 chrome 检查器中,您可以看到它执行 GET 和 POST。如果您已经加载了一条记录并点击保存,它将执行 PUT。

保存hasMany

当 RESTAdapter 将对象序列化为 JSON 时,它会遍历所有属性。如果属性是关系,则它们可能尚未实现并且可能不会发送到后端。(或作为 发送到后端undefined);

当我需要保存关系时(特别是如果它是异步的),我一直在将保存包装在 get 中以确保数据准备就绪。

strat.get('items').then(function(){
  strat.save(); //at this point items is populated
})

我相信有更好的方法可以做到这一点,并且很乐意学习它!

于 2013-11-08T05:47:48.637 回答
0

选项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,它是一个 Mixins 的集合,它使用子模型数据解决了这个问题。我也很喜欢这个命名法:stained-by-children 和 clean-embedded-children!非常适合这种困境!

于 2015-08-20T06:24:59.357 回答