删除与 ember-data 关联的模型

2023-12-27

我有两个模型:

App.User = DS.Model.create({
  comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.create({
  user: DS.belongsTo('App.User')
});

当删除用户时,它也会删除后端的所有评论,因此我应该从客户端身份映射中删除它们。

我从另一个地方列出了系统上的所有评论,因此删除用户后它只会崩溃。

有什么方法可以指定这种关联的依赖关系吗?谢谢!


当我想实现这种行为时,我使用 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 http://jsfiddle.net/sAmJ8/这表明它正在发挥作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除与 ember-data 关联的模型 的相关文章

随机推荐

  • 使用 Odata 查询基于 EF 的 DTO

    我有一个 ASP NET Core Web API 设置 其中包含 SQL Server 数据库和 EF 数据模型 版本 EF Microsoft EntityFrameworkCore 5 0 0 预览版 7 20365 15 OData
  • jQuery $.get 在 Chrome 中不起作用

    解决方案不起作用 在浪费了一整天学习前端 Web 开发之后 我将进度条放入 iframe 中 该 iframe 在 jquery 对话框内启动 期望 ajax get 请求从该页面开始工作 不幸的是我收到了完全相同的行为 发现问题 当您按
  • sonarqube“新代码”定义

    关于默认的质量门 奇怪的是 我们不清楚 新代码 的定义 为了说明这一点 假设我们通过添加新代码来更改文件 默认声纳质量门分析是仅对新代码行还是整个文件进行 我们不清楚 但怀疑这是整个文件 同事告诉我 项目未通过质量关卡 因为带有预先存在的阻
  • 形状渐变

    我正在尝试在按钮上执行渐变 但无法使其具有与按钮其他部分相同的渐变 我尝试在渐变中添加渐变 但它似乎不起作用并且找不到解决方案 这是我正在使用的代码 button color white padding 3px 3px 3px 0px bo
  • 如何将 CSV / MySQL 数据初始批量导入 Neo4j 数据库

    我正在考虑用 neo4j 数据库替换 MySQL 数据库 我是 neo4j 的初学者 想知道如何将我当前的 MySQL 数据批量插入到 neo4j 数据库中 以便我可以进行实验并开始了解 neo4j 关系数据库由4个表组成 Person O
  • 检索函数的返回类型而不调用该函数

    假设我在 TypeScript 中有一个这样的函数 export const foo function return a 1 b true c bar 如果我将此函数导入到另一个文件中 import foo from foobar 我的问题
  • 克隆 HashSet 的有效方法?

    前几天我回答过一个有趣的问题 https stackoverflow com questions 3897568 substract hashsets and return a copy就这样关于HashSet
  • 如何使用最小起订量模拟 ConfigurationManager.AppSettings

    我陷入了我不知道如何模拟的代码点 ConfigurationManager AppSettings User 我必须模拟 ConfigurationManager 但我不知道 我正在使用Moq http code google com p
  • Android:如何将解码器集成到多媒体框架

    最近我成功地将视频解码器移植到Android 还将输出转储到 SurfaceView 上并使用本机 API 检查输出 现在下一个任务是实现播放 暂停 流媒体等 即媒体播放器的其他功能 这样做将需要返工 因为所有这些功能都已在 Android
  • Lisp中函数参数是如何存储的?

    我假设传递给 Lisp 函数的值被分配给与参数名称匹配的引号 然而 令我惊讶的是 defun test x print eval x test 5 不起作用 变量 x 未绑定 因此 如果参数在函数中不存储为符号 那么本例中的 x 到底是什么
  • 使用数组调用 vararg 函数?

    在下面的示例中 我想将数组的内容传递给接收可变数量参数的函数 换句话说 我想传递给printf的内容foo按值传递这些参数 从而将这些参数传递到堆栈上 include
  • 如何使用 scikit-learn 从线性判别分析中获取特征向量

    如何从 scikit learn 线性判别分析对象中获取变化基矩阵 对于数组X有形状m x p m样品和p特征 和N类 缩放矩阵有p行和N 1列 该矩阵可用于将数据从原始空间变换到线性子空间 艾莉亚回答后编辑 让我们考虑以下示例 from
  • 如何检查是否跨浏览器兼容? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的小问题是是否有一个在线工具可以检查您的 html css 和 jQuery 页面是否跨浏览器兼容 我有一个带有 jquery 的简单淡
  • SH 脚本根据文件名将文件从一个目录移动到另一个目录

    我正在尝试编写一个 sh 脚本 该脚本将在我的其中一个下载完成时运行 它应该在 Downloads 上查找特定的文件名 并根据文件名将其移动到不同的目录 IE 我已经下载了 欢乐合唱团 的最后一集 文件名是 glee some trash
  • 如何仅列出将提交的文件?

    有什么方法可以获取当我键入以下内容时将提交的文件列表 git commit m my changes git status 列出太多 我可以去掉所有的词 但我不愿意 我不想被告知有关未跟踪文件的信息 我试过了 git ls files md
  • 如何在 ASP.NET MVC 中实现分页?

    目前 我正在使用许多博客文章中找到的策略 基本上 URL 包含页码 例如 Users List 5 将为您提供分页用户列表第 5 页上的用户 但是 我没有遇到一个页面必须列出两个单独的分页列表的情况 我该如何使用 ASP NET MVC 来
  • 如果我在 Bootstrap 3 中使用 .container-fluid,这是否意味着我需要使用网格类?

    我读过一些关于什么的答案 container and container fluid是 但我缺少的很简单 如果我使用 container fluid 我是否使用 col xs 6 col md 9 等列类 resize 和 containe
  • iOS 上的 ZBar 内存泄漏?

    我对 ZBar 扫描性能非常满意 但是如果这很重要的话 我在 ARC 下运行的项目上遇到了一个大问题 也就是说 似乎存在严重的内存泄漏 并且随着 readerView 的每次新显示 该泄漏呈指数级上升 在大约 10 倍的内存使用量开始呈指数
  • Deno 允许所有权限

    我经常发现自己在使用 Deno 时至少输入两到三个权限选项 deno run allow net allow read allow env app ts 有一种方法可以逃避显式权限 您可以使用 allow all或短选项 A允许所有权限 请
  • 删除与 ember-data 关联的模型

    我有两个模型 App User DS Model create comments DS hasMany App Comment App Comment DS Model create user DS belongsTo App User 当