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
函数会触发网络请求,但仅针对主模型(条目;a
PUT
请求到
../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();
}