询问:
任何人都可以告诉我为什么在尝试删除Ember-Data模型时可能会出现无限循环。逐步完成崩溃,问题似乎是在clearRelationships中,但无论我试图建立模型关系的程度如何,我似乎无法摆脱无限循环,而不是完全避免它们。
相关代码:
//// 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(2013年1月27日下午8:44)
附加上下文:这是使用ember-1.0.0-pre.4.js&&截至2013年1月27日最新提交的关于master的ember-data。我还在上面的示例代码中添加了一些内容。
更新2(2013年2月1日下午5:25)
扑通!问题仍然存在,似乎有很多涉及deleteRecord的问题最近在github问题跟踪器上听起来与我的问题类似。这是我在跟踪器上的具体问题的链接:
https://github.com/emberjs/data/issues/671
答案 0 :(得分:1)
这是一个错误。这个在Github上的拉取请求为我修复了它。 https://github.com/emberjs/data/pull/715
答案 1 :(得分: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)
的关系,最终到达上面一次又一次调用set的部分。
我不确定解决此问题的正确方法,但我通过删除帐户上的用户belongsTo关系让我在我的情况下工作。所以我的新模特看起来像这样
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')
});