Ember.js绑定并保存belongsTo属性

时间:2015-06-18 14:44:02

标签: ember.js ember-data

我有两个模型通过belongsTo(互惠关系,即1:1)相互关联,利用async属性。检索到一条记录并将其设置为路由器上的Model后,我可以访问主记录中的属性及其关联 - 一切正常。我使用输入助手将属性绑定到inputtextarea元素,以便用户可以对模型进行更改,包括关联记录的属性。但是,当我运行save()函数时,Ember只对主记录发出PUT请求,而不是对相关记录发出请求,即使它是更改的记录。

Entry.js(型号)

export default DS.Model.extend({
  // Properties
  entry: DS.attr('Number'),
  ...

  // Relational properties
  definition: DS.belongsTo('definition', {async: true}),
 ...
});

Definition.js(Model)

export default DS.Model.extend({
  // Properties
  blocks: DS.attr(),
  ...
  // Relational properties
  entry: DS.belongsTo('entry', {async: true}),
  ...
});

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

提前致谢。

3 个答案:

答案 0 :(得分:2)

在Ember保存模型时,其他型号不会被保存。 您需要自己保存每个模型。我建议你为每个模型创建一个单独的视图并单独保存,因为你可能会遇到一致性问题。

无论如何,这里是你如何保存两个模型的。

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将需要从服务器获取模型。这就是它返回承诺的原因。

在我看来,您只是为了更新关系而尝试保存定义模型。你不需要这样做。第一次保存就足够了。应该在服务器上更新其他模型。

答案 1 :(得分:1)

首先你需要保存第一个模型设置返回数据到第二个模型保存第二个模型

<强> 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 def=this.controllerFor("deffinition").get("content"); // cotroller of defeinition route
      var entry = this.controller.get('content'); // controller of entry route
      def.save().then(function(res){
        // console.log('Saved Success');
        let def = _this.store.peekRecord('Definition', res.get('id'));
        entry.set('deffinition', def);
        entry.save().then(function (res) {
         // Success callback
            
        });
      }, function(err){
        // console.log(err);
      });
    }
  }
});

WORKING WITH RELATIONSHIPS

答案 2 :(得分:0)

Ember不会对你的模特进行级联保存,你需要保存自己的其他模型。