Używam mixin, gdy chcę zaimplementować to zachowanie. Moje modele są zdefiniowane następująco:
App.Post = DS.Model.extend(App.DeletesDependentRelationships, {
dependentRelationships: ['comments'],
comments: DS.hasMany('App.Comment'),
author: DS.belongsTo('App.User')
});
App.User = DS.Model.extend();
App.Comment = DS.Model.extend({
post: DS.belongsTo('App.Post')
});
mixin sama:
App.DeletesDependentRelationships = Ember.Mixin.create({
// an array of relationship names to delete
dependentRelationships: null,
// set to 'delete' or 'unload' depending on whether or not you want
// to actually send the deletions to the server
deleteMethod: 'unload',
deleteRecord: function() {
var transaction = this.get('store').transaction();
transaction.add(this);
this.deleteDependentRelationships(transaction);
this._super();
},
deleteDependentRelationships: function(transaction) {
var self = this;
var klass = Ember.get(this.constructor.toString());
var fields = Ember.get(klass, 'fields');
this.get('dependentRelationships').forEach(function(name) {
var relationshipType = fields.get(name);
switch(relationshipType) {
case 'belongsTo': return self.deleteBelongsToRelationship(name, transaction);
case 'hasMany': return self.deleteHasManyRelationship(name, transaction);
}
});
},
deleteBelongsToRelationship: function(name, transaction) {
var record = this.get(name);
if (record) this.deleteOrUnloadRecord(record, transaction);
},
deleteHasManyRelationship: function(key, transaction) {
var self = this;
// deleting from a RecordArray doesn't play well with forEach,
// so convert to a normal array first
this.get(key).toArray().forEach(function(record) {
self.deleteOrUnloadRecord(record, transaction);
});
},
deleteOrUnloadRecord: function(record, transaction) {
var deleteMethod = this.get('deleteMethod');
if (deleteMethod === 'delete') {
transaction.add(record);
record.deleteRecord();
}
else if (deleteMethod === 'unload') {
var store = this.get('store');
store.unloadRecord(record);
}
}
});
pamiętać, że można określić poprzez deleteMethod
, czy chcesz wysłać DELETE
żądań do API. Jeśli twój back-end jest skonfigurowany tak, aby automatycznie usuwał zależne rekordy, wtedy będziesz chciał użyć wartości domyślnej.
Oto jsfiddle, który pokazuje go w akcji.
Hej, to wygląda bardzo dobrze! Chociaż myślę, że 'ember-data' powinien wspierać coś takiego w rdzeniu. Dzięki za tak szczegółowe wyjaśnienie, koleś! – josepjaume
Zgadzam się. W Ember Data brakuje kilku kluczowych funkcji, ale wciąż jest bardzo młody i bardzo szybko się rozwija. – ahmacleod
Dane Ember nie obsługują już transakcji, więc powyższy kod będzie musiał zostać zmieniony, aby działał z ostatnimi kompilacjami. – ahmacleod