我有一个正在构建的 emberjs/ember-data/firebase/emberfire 客户端应用程序。
Ember : 1.11.0-beta.1+canary.d2d1490d
Ember Data : 1.0.0-beta.14.1
EmberFire : 1.3.2
jQuery : 1.11.2
我在 ember-data 模型中声明了一个双向关系
widget model belongsTo customer
customer hasMany widgets
使用 addObject() 从客户控制器创建相关小部件工作正常
// add widget
var widget = this.store.createRecord('widget', {
name: data.name.trim(),
_time: new Date().getTime(),
customer: model,
});
// save and add to model
widget.save().then(function(widget){
model.get('widgets').addObject(widget);
model.save();
});
对 FB 和 UI 中的数据进行审核看起来不错。
因此,现在要从其小部件视图控制器中实际删除小部件(而不是将其与客户取消链接),我还想将删除级联到拥有该小部件的客户。我知道这应该是自动的,在模型中使用正确的 hasMany/belongsTo 设置,但它失败了。我认为问题是 emberfire,但在我报告错误之前,有人可以检查我吗?
如果我在 WidgetsViewController 中使用 destroyRecord(),则会删除小部件,但不会级联到客户..也没有错误。
一些研究建议使用
model.deleteRecord();
this.store.dematerializeRecord(model);
...也许是因为这不会持续删除,没有错误。但是当您添加 model.save() 以提交删除时,Firebase 错误:
FIREBASE WARNING: Exception was thrown by user callback. TypeError: Cannot read property 'get' of null
at DS.FirebaseAdapter.DS.Adapter.extend._handleChildValue (http://0.0.0.0:4200/assets/vendor.js:80787:20)
该代码显示:
_handleChildValue: function(store, type, serializer, snapshot) {
//No idea why we need this, we are alredy turning off the callback by
//calling ref.off in recordWillUnload. Something is fishy here
if (store.isDestroying) {
return;
}
var value = snapshot.val();
if (value === null) {
var id = this._getKey(snapshot);
var record = store.getById(type, id);
//TODO refactor using ED
if (!record.get('isDeleted')) {
record.deleteRecord();
}
} else {
...
}
}
那么任何人都可以阐明firebase开发人员是否有理由认为这不是必需的,或者它是否是并且它只是没有实现?..或者也许将我指向另一个有效的方向?
---------- 更新添加的模型关系 ---------------
// customer model
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string', { async:true }),
widgets: DS.hasMany('widget', { async:true }),
_time: DS.attr('number', { async:true }),
});
// widget model
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string', { async:true }),
_time: DS.attr('number', { async:true }),
customer: DS.belongsTo('customer', { async:true })
});