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の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 に答える