ember.js,如何在新创建的记录中设置关系

ember.js,如何在新创建的记录中设置关系,ember.js,Ember.js,我想设置两个新创建的记录之间的关系:我创建国家,我创建城市,然后设置国家有许多城市,反之城市属于国家。从 您不能将承诺指定为关系[…],但是,您可以在承诺履行后轻松设置关系: 上面的例子并不完全适合我的情况,因为我不知道user记录的id,在代码段中,该记录被假定为1。我的例子更像 App.Country = DS.Model.extend({ name: DS.attr('string'), cities: DS.hasMany('city', {async: true}) });

我想设置两个新创建的记录之间的关系:我创建
国家
,我创建
城市
,然后设置
国家
有许多
城市
,反之
城市
属于国家
。从

您不能将承诺指定为关系[…],但是,您可以在承诺履行后轻松设置关系:

上面的例子并不完全适合我的情况,因为我不知道
user
记录的
id
,在代码段中,该记录被假定为
1
。我的例子更像

App.Country = DS.Model.extend({
  name: DS.attr('string'),
  cities: DS.hasMany('city', {async: true})
});

App.City = DS.Model.extend({
  name: DS.attr('string'),
  country: DS.belongsTo('country', {async: true})
});
然后,在处理记录时,我希望一次性创建并链接所有记录:

var store = this.store;

var country = store.createRecord('country', {
    name: 'France'
});

var city = store.createRecord('city', {
    name: 'Paris'
});

// How to get the 'foo' created just above out of the store? What id?
store.find('city', ??).then(function(city) {
    country.set('cities', [city]);
});

// Same story, what's the id of the country I just created?
store.find('country', ??).then(function(country) {
    city.set('country', country);
});

问题是:在我上面的代码片段中,应该在
中添加什么?
s。

我将如何实现它-

var store = this.store;


var onCountrySuccess = function(resolvedCountry){
resolvedCountry.get('id');
};

var onCountryFailure = function() {} ;

var onSuccessfulCityCreate = function(resolvedCity){
   store.createRecord('country', {
    name: 'France',
    cities : [resolvedCity]
 }.save().then(onCountrySuccess, onCountryFailure):

var onCityFailure = function(){ alert("Failed") });

var city = store.createRecord('city', {
    title: 'Paris'
}).save().then(onSuccessfulCityCreate, onCityFailure);
如果你有一组城市

var resolve = function(resolvedRecords) {
 store.createRecord('country', {
    name: 'France',
    cities : resolvedRecords
 }.save();
}:
var reject = function(){}; 

var citiesToSave = someCityContainingArray.map(function(city){
 return city.save();
});

Ember.RSVP.all(citiesToSave).then(resolve, reject);

据我所知,余烬数据无法创建唯一的ID。这是您需要在API端点上执行的操作,因此需要链接一些请求,直到您正确设置并保存了所有关系

例如:

var country = store.createRecord('country', {
    name: 'France'
});

var city = store.createRecord('city', {
    name: 'Paris'
});

country.save().then(function (country) {

  city.set('country', country);
  return city.save();

}).then(function (city) {

  country.get('cities').addObject(city);
  return country.save();

}).then(function () {

  alert('all done.');

});

谢谢你的回复。我修改了一些拼写错误。您的代码有两个问题:(1)如果在完成关联设置之前不想保存记录,该怎么办?(2) 最后,没有设置记录
城市
国家
字段,您要做的最后一件事是检索
国家
id
。大概你想继续从商店取
国家
,然后把它粘到
城市
?我用你的解决方案设置好了。理想情况下,每次点击按钮,列表中都会出现一个新的法国/巴黎项目,但是。。。这就是我们如何实现我们的hasManySavings。顺便说一句,你有城市:标题(应该是名字),如果我改变了它并删除了hasMany关系(从模型中),它也开始工作了(为什么?我不知道=D也许你需要一个适配器来保存这样)嗨@kristjan reinhold,谢谢你的回复。您在的示例之所以有效,是因为您使用了
city
作为全局变量,因此它在您承诺链的第一次回调中创建,并在最后一次回调中可用。听着,我在bbucket上建立了一个存储库来解释我的意思:是你原来的jsbin;很少调整以使其运行。删除了整个关联模型,仍然有效,我去掉了全局变量的魔力,打破了。在本文中,我举了一个最简单的例子来说明您的回调过程。您好,谢谢您的回复。(1) 无论您使用什么适配器,都将创建唯一的ID。我过去经常到处玩,它似乎很管用。(2) 你们要做的是:拯救国家,坚持国家到城市,拯救城市,坚持城市到国家,再次拯救国家。也就是说,你用三个
save()
点击服务器,而我想用两个来逃脱。(3) 我邀请您转到实现您的解决方案的位置,然后单击“添加数据”。你能解释一下发生了什么吗?“巴黎”眨了眨眼就消失了不知道jsbin出了什么问题。我刚刚针对一个简单的REST端点测试了代码,使用了REST适配器而不是Fixture适配器,它可以正常工作。(我也放弃了Fixture Adapter的开发,因为我一直遇到类似的问题,并且通常针对简单的本地REST端点进行开发)。根据您对API端点的控制程度,您可以进行2次保存,因为您可以在城市数据库对象中添加一个国家/地区外键。从技术上讲,您不需要在country对象上存储所有城市的列表,因为您可以在查询中返回它们。在客户端进行编辑时,
country.get('cities').addObject(city)
应该足以在您的会话期间跟踪关系。这听起来像是一句聪明的话,但我不确定我是否理解。你是说我应该像在底层服务器端数据库中那样,忘记使用javascript链接表并操作外键吗?现在我考虑这个选项,我觉得它很合理,我问我自己是什么关系,我的意思是为什么eMeBER数据提供了抽象。
var country = store.createRecord('country', {
    name: 'France'
});

var city = store.createRecord('city', {
    name: 'Paris'
});

country.save().then(function (country) {

  city.set('country', country);
  return city.save();

}).then(function (city) {

  country.get('cities').addObject(city);
  return country.save();

}).then(function () {

  alert('all done.');

});