2

我正在使用 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 的实例并将它们连接起来。他们都没有 server-side id。像这样的东西:

var a = A.createRecord();
    b = B.createRecord();
b.set('a', a)
a.get('b').addObject(b)

当我想保存我制作的那些模型时:

a.transaction.commit()

我希望看到:

  1. 用空 b 保存 a // []
  2. 将a pass a的id存入b后保存b
  3. 保存 b 后重新获取 a

但不幸的是,ember 并行执行了 2 个请求,而 a 的请求数据为:

"{//some fields, b: [/url_to_b//]}" // we dont have b's id 

b的请求数据是:

"{//some fields } // we dont have a's id

解决这个问题的最佳方法是什么,新的 ember 是否有适合我情况的默认解决方案,或者我应该手动完成所有工作?

4

1 回答 1

1

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

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 
   }
}
于 2013-03-15T08:20:51.000 回答