1

お問い合わせ:
Ember-Data Model を削除しようとすると無限ループが発生する理由を教えてください。クラッシュをステップ実行すると、問題は clearRelationships にあるように見えますが、Model リレーションシップを最小限に抑えようとしても、それらをすべて一緒に回避しない限り、無限ループから逃れることはできないようです。


関連コード:

//// Config
App = Ember.Application.create();
App.Adapter = DS.RESTAdapter.extend();
App.store = DS.Store.create({
  revision: 11,
  adapter: App.Adapter.create()
});
App.Router = Ember.Router.extend({});
App.Router.map(function() {
  this.resource('main', { path: '/' });
});

//// Models
App.Scientist = DS.Model.extend({
  name:     DS.attr('string'),
  tests:    DS.hasMany('App.Tests'),
  criteria: DS.belongsTo('App.Criteria')
});
App.Test = DS.Model.extend({
  name:      DS.attr('string'),
  scientist: DS.belongsTo('App.Scientist'),
  criteria:  DS.belongsTo('App.Criteria')
});
App.Criteria = DS.Model.extend({
  name:      DS.attr('string'),
  scientist: DS.belongsTo('App.Scientist'),
  test:      DS.belongsTo('App.Test'),
  resources: DS.hasMany('App.Resource')
});
App.Resource = DS.Model.extend({
  name:     DS.attr('string'),
  criteria: DS.belongsTo('App.Criteria')
});

//// Pre-Load Models
App.store.loadMany(App.Test,
  [{id:'1', scientist_id:'1', name:'gravity', criteria_id:'2'},
   {id:'2', scientist_id:'1', name:'not gravity', criteria_id:'3'}]);
App.store.load(App.Scientist, 
  {id:'1', name:'Bill', tests:['1', '2'], criteria_id:'1'});
App.store.load(App.Criteria, 
  {id:'1', name:'control', scientist_id:'1', test_id:null, resources:['1']});
App.store.loadMany(App.Criteria,
  [{id:'2', name:'variation1', scientist_id:null, test_id:'1', resources:['2','3']},
   {id:'3', name:'variation2', scientist_id:null, test_id:'2', resources:['4','5']}]);
App.store.loadMany(App.Resource, 
  [{id:'1', name:'resource1', criteria_id:'1'},
   {id:'2', name:'resource2', criteria_id:'2'},
   {id:'3', name:'resource3', criteria_id:'2'},
   {id:'4', name:'resource4', criteria_id:'3'},
   {id:'5', name:'resource5', criteria_id:'3'}]);

var filter = App.Test.filter(
  function(model) { if (model.get('isLoaded') === true) { return model; } }
);

App.MainRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    controller.set('tests', filter);
  }
});

///// Controller
App.MainController = Ember.ArrayController.extend({
  name: 'Main',
  createTest: function() {
    App.Test.createRecord();
    App.store.commit();
  },
  removeTest: function(test) {
    test.deleteRecord();
    App.store.commit();
  }
});

再現手順:
http://jsfiddle.net/hilem/GMt7H/

1) ブラウザ コンソールを開きます。
2) フィドルを実行します。
3) リスト項目の 1 つで削除を押したときにコンソールを監視します。


更新 1 (2013 年 1 月 27 日 8:44PM)
追加のコンテキスト: これは、ember-1.0.0-pre.4.js && を使用しており、2013 年 1 月 27 日時点で master 上の ember-data の最新のコミットです。また、上記のサンプル コードにもう少し追加しました。


更新 2 (2013 年 2 月 1 日 5:25PM)
バンプ! 問題はまだ存在します。最近、github issue tracker で deleteRecord に関連する問題がかなりあるようで、私の問題に似ています。トラッカーに関する私の特定の問題へのリンクは次のとおりです:
https://github.com/emberjs/data/issues/671

4

2 に答える 2

1

バグです。Github のこのプル リクエストで修正されました。https://github.com/emberjs/data/pull/715

于 2013-02-15T22:04:35.630 に答える
0

私は同様の問題を抱えていました。私はこれらのようなモデルを持っていました

App.User = DS.Model.extend({
  account: DS.belongsTo('App.Account'),
  name: DS.attr('string')

});

App.Account = DS.Model.extend({
  user: DS.belongsTo('App.User'),
  type: DS.attr('string')
});

再帰は実際には clearRelationships では発生していませんが、ember.js の set メソッドのこのセクションでは発生しています。

var meta = obj[META_KEY], desc = meta && meta.descs[keyName],
      isUnknown, currentValue;
  if (desc) {
    desc.set(obj, keyName, value);
  } else {
   ....
  }

ユーザーを削除すると、最終的に呼び出しが何度も何度も設定された上記のセクションに到達する呼び出しをクリアしようとしset(this, "account", null)ました。

これを修正する正しい方法はわかりませんが、アカウントのユーザーの属している関係を削除することで、私の状況で機能するようになりました。だから私の新しいモデルはこのように見えます

App.User = DS.Model.extend({
  account: DS.belongsTo('App.Account'),
  name: DS.attr('string')

});

App.Account = DS.Model.extend({
  // user: DS.belongsTo('App.User'),
  type: DS.attr('string')
});
于 2013-02-07T00:33:35.910 に答える