我有两种模式:
App.User = DS.Model.create({
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.create({
user: DS.belongsTo('App.User')
});
当用户被删除时,它也会删除后端的所有注释,因此我应该从客户端身份映射中删除它们。
我列出了来自其他地方的系统上的所有评论,因此删除用户后它就会崩溃。
有没有办法在关联中指定这种依赖?谢谢!
答案 0 :(得分:9)
当我想实现此行为时,我使用mixin。我的模型定义如下:
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本身:
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);
}
}
});
请注意,您可以通过deleteMethod
指定是否要将DELETE
请求发送到您的API。如果您的后端配置为自动删除相关记录,那么您将需要使用默认值。
这是一个显示实际效果的jsfiddle。
答案 1 :(得分:3)
快速而肮脏的方法是将以下内容添加到您的用户模型
destroyRecord: ->
@get('comments').invoke('unloadRecord')
@_super()
答案 2 :(得分:0)
我调整了@ahmacleod的答案,以便与ember-cli 2.13.1
和ember-data 2.13.0
一起使用。我遇到了嵌套关系的问题,以及从数据库中删除实体后,其ID被重用的事实。这导致与余烬数据模型中的残余物发生冲突。
import Ember from 'ember';
export default Ember.Mixin.create({
dependentRelationships: null,
destroyRecord: function() {
this.deleteDependentRelationships();
return this._super()
.then(function (model) {
model.unloadRecord();
return model;
});
},
unloadRecord: function() {
this.deleteDependentRelationships();
this._super();
},
deleteDependentRelationships: function() {
var self = this;
var fields = Ember.get(this.constructor, 'fields');
this.get('dependentRelationships').forEach(function(name) {
self.deleteRelationship(name);
});
},
deleteRelationship (name) {
var self = this;
self.get(name).then(function (records) {
if (!records) {
return;
}
var reset = [];
if (!Ember.isArray(records)) {
records = [records];
reset = null;
}
records.forEach(function(record) {
if (record) {
record.unloadRecord();
}
});
self.set(name, reset);
});
},
});
最终,我必须将关系设置为[]
(hasMany)或null
(belongsTo)。否则我会遇到以下错误消息:
Assertion Failed: You cannot update the id index of an InternalModel once set. Attempted to update <id>.
也许这对其他人有帮助。