Каскадная модель удаления и ее отношения с emberjs

У меня есть клиентское приложение 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 и в пользовательском интерфейсе выглядит хорошо.

Итак, теперь, чтобы фактически удалить виджет из его контроллера представления виджета (не отсоединять его от клиента), я хочу также каскадно удалить клиент, которому принадлежит этот виджет. Я понимаю, что это должно быть автоматическим с правильной настройкой hasMany/ ownTo в модели, но это не удалось. Я думаю, что проблема в emberfire, но прежде чем я сообщу об ошибке, кто-то может проверить меня?

если я использую destroyRecord() в WidgetsViewController, виджет удаляется, но нет каскада для клиента.. также нет ошибок.

Некоторые исследования предложили использовать

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 })
});

0 ответов

Другие вопросы по тегам