Ember.js 如何提交相关模型

Ember.js 如何提交相关模型,ember.js,ember-data,Ember.js,Ember Data,我正在使用ember-pre4和ember data rev 11 型号: A = DS.Model.extend({ //some other fields b: DS.hasMany('B') }) B = DS.Model.extend({ //some other fields a: DS.hasOne('A') }) 在我的路由器中,我创建了模型A的一个实例,创建了模型B的一个实例,并将它们连接起来。它们都没有服务器端id。大概是这样的: var a

我正在使用ember-pre4和ember data rev 11

型号:

A = DS.Model.extend({
    //some other fields
    b: DS.hasMany('B')
})
B = DS.Model.extend({
    //some other fields
    a: DS.hasOne('A') 
})
在我的路由器中,我创建了模型A的一个实例,创建了模型B的一个实例,并将它们连接起来。它们都没有服务器端
id
。大概是这样的:

var a = A.createRecord();
    b = B.createRecord();
b.set('a', a)
a.get('b').addObject(b)
当我想保存我制作的模型时:

a.transaction.commit()
我希望看到:

  • 用空b/[]保存a
  • 保存a密码后,将a的id保存到b并保存b
  • 保存b后,重新蚀刻a
  • 但不幸的是,ember并行执行2个请求,a的请求数据为:

    "{//some fields, b: [/url_to_b//]}" // we dont have b's id 
    
    "{//some fields } // we dont have a's id
    
    b的请求数据为:

    "{//some fields, b: [/url_to_b//]}" // we dont have b's id 
    
    "{//some fields } // we dont have a's id
    
    解决这个问题的最佳方法是什么,new ember是否有适合我的默认解决方案,或者我应该手动完成所有工作

    解决方案: 我在waitForParents函数中包装了createRecord函数:

    waitForParents:function (record, callback, context) {
        var observers = new Em.Set();
    
        record.eachRelationship(function (name, meta) {
            var relationship = get(record, name);
    
            if (meta.kind === 'belongsTo' && relationship && get(relationship, 'isNew')) {
                var observer = function () {
                    relationship.removeObserver('id', context, observer);
                    observers.remove(name);
                    finish();
                };
    
                relationship.addObserver('id', context, observer);
                observers.add(name);
            }
        });
    
        finish();
    
        function finish() {
            if (observers.length === 0) {
                callback.call(context);
            }
        }
    },
    
    createRecord:function (store, type, record) {
       this.waitForParents(record, function () {   
       // createRecord code here 
       }
    }
    

    你有什么解决办法吗?我也有同样的问题,我试过了,但是运气不好。您在waitForParent回调中做什么?您是否将其称为createrecord的.\u super()?我的问题是,只触发了一个请求(这是正确的),但在请求数据中,子url会自动嵌入,但不完整(缺少id,例如/api/v1/child/)。为了解决这个问题,我从序列化程序重写addBelongsTo函数。addBelongsTo:function(hash,record,key,relationship){var id=get(record,relationship.key+'.id');如果(!Em.isNone(id)){hash[key]=this.getItemUrl(relationship,id);},我认为这不能解决问题。原因是因为在我的例子中,正是这种关系导致了这个问题。因此,如果有什么问题,我应该重写序列化程序中的addHasMany方法。在提交之前,您如何添加关系?您是向hasmany关系添加对象还是为子模型设置belongsTo关系?addHasMany函数(hasmany关系的序列化函数)仅当您指定embedded:“always”时,才会将相关记录添加到父级,它可以包括id(如果存在)也可以不包括id(您可以检查它store.serialize函数)。很多东西取决于您的后端,我的意思是一些RESTAPI支持创建请求时的相关对象,即{static_字段:value,related_字段:{static_字段:value}}可以创建2个对象并在后端将它们关联起来。在我的示例中,我不支持嵌入:“始终”和使用“加载”。我明白了。在我的例子中,我嵌入了“始终”。它通过覆盖addHasMany对我起了作用。