Tôi sử dụng mixin khi tôi muốn thực hiện hành vi này. Mô hình của tôi được định nghĩa như sau:
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')
});
Các mixin bản thân:
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);
}
}
});
Lưu ý rằng bạn có thể xác định qua deleteMethod
hay không, bạn muốn gửi DELETE
yêu cầu API của bạn. Nếu back-end của bạn được cấu hình để xóa các bản ghi phụ thuộc tự động, thì bạn sẽ muốn sử dụng mặc định.
Đây là một số jsfiddle cho biết nó đang hoạt động.
Hey, điều này có vẻ cực kỳ OK! Mặc dù tôi nghĩ rằng 'dữ liệu ember 'sẽ hỗ trợ một cái gì đó như thế trong lõi. Cảm ơn lời giải thích chi tiết như vậy, anh bạn! – josepjaume
Tôi đồng ý. Dữ liệu Ember thiếu một số tính năng chính nhưng nó vẫn còn rất trẻ và cải thiện rất nhanh chóng. – ahmacleod
Dữ liệu Ember không còn hỗ trợ giao dịch, do đó, mã ở trên sẽ cần được sửa đổi để làm việc với các bản dựng gần đây. – ahmacleod