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.');
});