Ember.js绑定到并保存belongsTo属性
我有两个模型通过Ember.js绑定到并保存belongsTo属性,ember.js,ember-data,Ember.js,Ember Data,我有两个模型通过belongsTo(互惠关系,即1:1)利用async属性相互关联。在检索了一条记录并将其设置为路由器上的模型后,我可以访问主记录中的属性,并且它的关联在那里一切正常。我使用输入帮助程序将属性绑定到input和textarea元素,以便用户可以更改模型,包括相关记录上的属性。但是,当我运行我的save()函数时,Ember只对主记录发出PUT请求,而不是对关联的记录发出请求,即使该记录已更改 Entry.js(模型) Definition.js(模型) Route.js expo
belongsTo
(互惠关系,即1:1)利用async
属性相互关联。在检索了一条记录并将其设置为路由器上的模型后,我可以访问主记录中的属性,并且它的关联在那里一切正常。我使用输入帮助程序将属性绑定到input
和textarea
元素,以便用户可以更改模型,包括相关记录上的属性。但是,当我运行我的save()
函数时,Ember只对主记录发出PUT
请求,而不是对关联的记录发出请求,即使该记录已更改
Entry.js(模型)
Definition.js(模型)
Route.js
export default Ember.Route.extend({
model: function(params){
return this.store.find('Entry', params.entry_id);
},
actions: {
saveDef: function(){
// console.log('Saving . . .');
var entry = this.controller.get('content');
entry.save().then(function(){
// console.log('Saved Success');
}, function(err){
// console.log(err);
});
}
}
});
提前感谢。余烬不会对您的模型进行级联保存,您需要自己保存另一个模型。在余烬中保存模型时,其他模型不会被保存。 您需要单独保存每个模型。我建议您为每个模型创建一个单独的视图并单独保存,因为您可能会遇到一致性问题 不管怎样,下面是保存两个模型的方法
var model = this.controller.get('content');
model.save();
var definition = model.get('definition');
if( definition && definition.then ) {
definition.then(function(definition) { definition.save(); });
} else if( definition ) {
definition.save();
}
更新:
这里的问题是没有加载定义。因此,当您调用model.get('definition')
Ember时,需要从服务器获取模型。这就是它回报承诺的原因
在我看来,您试图保存定义模型只是为了更新关系。你不需要那样做。第一次储蓄就足够了。应在服务器上更新其他模型。首先,您必须保存第一个模型,将返回的数据设置为第二个模型保存第二个模型
Route.js
export default Ember.Route.extend({
model: function(params){
return this.store.find('Entry', params.entry_id);
},
actions: {
saveDef: function(){
// console.log('Saving . . .');
var entry = this.controller.get('content');
entry.save().then(function(){
// console.log('Saved Success');
}, function(err){
// console.log(err);
});
}
}
});
导出默认Ember.Route.extend({
型号:功能(参数){
返回此.store.find('Entry',params.Entry\u id);
},
行动:{
saveDef:function(){
//console.log('Saving…');
var def=this.controllerFor(“definition”).get(“content”);//定义路由的cotroller
var entry=this.controller.get('content');//入口路由的控制器
def.save().then(函数(res){
//console.log(“保存成功”);
让def=_this.store.peekRecord('Definition',res.get('id');
entry.set('definition',def);
entry.save().then(函数(res){
//成功回调
});
},函数(err){
//控制台日志(err);
});
}
}
});代码>更改关系不会在模型上设置脏标志。这是一个已知的错误。但是,save调用应触发网络请求。它没有被触发吗?检查Chrome Inspector中的网络选项卡。所谓“更改关系”是指“更改相关记录上的属性”吗?老实说,我并没有改变这种关系。就网络请求而言,save
函数会触发网络请求,但仅针对主模型(条目;aPUT
请求到../entries/:id
),而不针对定义API端点。我想如果记录被嵌入,那就可以了,但事实并非如此。此外,我更新了问题,以更准确地表达我的问题。你是对的。如果要更改另一条记录(定义)的属性,则需要保存该记录。换句话说,this.controller.get('content.definition').save()
我仍然得到未捕获类型错误:definition.save不是wierd的函数。这可能是由于关系是异步的。尝试更新后的答案。你也可以添加模板吗?成功了。你介意解释一下这个额外的代码到底在做什么吗?我知道它与承诺有关,但对我来说还是有点神秘。太好了。因此,假设我只想保存定义模型,我可以只做this.controller.get('content.definition')。然后(function(def){def.save();})代码>?它似乎起作用了。if
语句只是为了使用promise。然后语法用于异步记录,而elseif
则执行save
函数(假设它不是null
);是这样吗?
var model = this.controller.get('content');
model.save();
var definition = model.get('definition');
if( definition && definition.then ) {
definition.then(function(definition) { definition.save(); });
} else if( definition ) {
definition.save();
}