私が構築している 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 })
});