一次保存多个 Backbone 模型

2024-04-05

我有一个包含大量模型的 Backbone 集合。

每当在模型上设置特定属性并保存它时,就会触发大量计算并重新渲染 UI。

但是,我希望能够同时在多个模型上设置属性,并且只有在全部设置完毕后才进行保存和重新渲染。当然,我不想为一项操作发出多个 http 请求,并且绝对不想必须重新渲染界面十次。

我希望在 Backbone.Collection 上找到一个保存方法,该方法可以计算出哪些模型 hasChanged(),将它们组合在一起作为 json 并发送到后端。然后,可以通过集合上的事件来触发重新渲染。没有这样的运气。

这似乎是一个非常常见的要求,所以我想知道为什么 Backbone 没有实现。这是否违背 RESTful 架构,将多个内容保存到单个端点?如果是这样,那又怎样?发出 1000 个请求来持久化 1000 个小项目是不可能的。

那么,使用我自己的 save 方法来增强 Backbone.Collection 的唯一解决方案是迭代其所有模型并为所有已更改的模型构建 json 并将其发送到后端吗?或者有人有更简洁的解决方案(或者我只是错过了一些东西!)?


我最终用几种方法来增强 Backbone.Collection 来处理这个问题。

saveChangeMethod 创建一个虚拟模型以传递给 Backbone.sync。模型中所有主干的同步方法需要的是它的 url 属性和 toJSON 方法,所以我们可以轻松地解决这个问题。

在内部,模型的 toJSON 方法仅返回其属性的副本(将发送到服务器),因此我们可以愉快地使用仅返回模型数组的 toJSON 方法。 Backbone.sync 将其字符串化,这只为我们提供属性数据。

成功后,saveChanged 会触发要处理一次的集合上的事件。添加了一些代码,使其针对任何批次模型中已更改的每个属性触发一次特定事件。

Backbone.Collection.prototype.saveChanged = function () {
    var me = this,
        changed = me.getChanged(),
        dummy = {
            url: this.url,
            toJSON: function () {
                return changed.models;
            }
        },
        options = {
            success: function (model, resp, xhr) {
                for (var i = 0; i < changed.models.length; i++) {
                    changed.models[i].chnageSilently();
                }
                for (var attr in changed.attributes) {
                    me.trigger("batchchange:" + attr);
                }
                me.trigger("batchsync", changed);
            }
        };
    return Backbone.sync("update", dummy, options);
}

然后我们只需要集合上的 getChanged() 方法。这将返回一个具有 2 个属性的对象,一个已更改模型的数组和一个标记哪些属性已更改的对象:

Backbone.Collection.prototype.getChanged = function () {
    var models = [],
        changedAttributes = {};
    for (var i = 0; i < this.models.length; i++) {
        if (this.models[i].hasChanged()) {
            _.extend(changedAttributes, this.models[i].changedAttributes());
            models.push(this.models[i]);
        }
    }
    return models.length ? {models: models, attributes: changedAttributes} : null;
}

尽管这稍微滥用了主干“更改模型”范例的预期用途,但批处理的全部要点是,当模型更改时,我们不希望发生任何事情(即触发任何事件)。

因此,我们必须将 {silent: true} 传递给模型的 set() 方法,因此使用骨干网的 hasChanged() 来标记等待保存的模型是有意义的。当然,如果您出于其他目的而默默地更改模型,这将是有问题的 - collection.saveChanged() 也会保存这些模型,因此值得考虑设置替代标志。

无论如何,如果我们这样做,在保存时,我们需要确保主干现在认为模型没有改变(不触发它们的更改事件),所以我们需要手动操作模型,就好像它没有改变一样被改变了。 saveChanged() 方法迭代我们更改的模型,并在模型上调用这个 changeSilently() 方法,这基本上只是 Backbone 的 model.change() 方法,没有触发器:

Backbone.Model.prototype.changeSilently = function () {
    var options = {},
    changing = this._changing;
    this._changing = true;
    for (var attr in this._silent) this._pending[attr] = true;
    this._silent = {};
    if (changing) return this;

    while (!_.isEmpty(this._pending)) {
        this._pending = {};
        for (var attr in this.changed) {
        if (this._pending[attr] || this._silent[attr]) continue;
        delete this.changed[attr];
        }
        this._previousAttributes = _.clone(this.attributes);
    }
    this._changing = false;
    return this;
}

Usage:

model1.set({key: value}, {silent: true});
model2.set({key: value}, {silent: true});
model3.set({key: value}, {silent: true});
collection.saveChanged();

关于。 RESTful.. 对集合的端点执行 PUT 来更改其“某些”记录是不太正确的。从技术上讲,PUT 应该替换整个集合,但在我的应用程序实际上需要替换整个集合之前,我很乐意采取务实的方法。

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

一次保存多个 Backbone 模型 的相关文章

  • 在 Google 表格脚本中设置活动单元格的值

    我想创建一个公式 在某个单元格更改上创建时间戳 下面的代码就可以了 我现在想做的是将公式转换为纯文本 将该时间戳锚定到工作表上 如果您手动执行此操作 您将选择时间戳 复制它们并将它们粘贴为值 我不想手动执行此操作 因此我创建了下面的脚本 它
  • libxmljs 的替代品 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目标 使用 Node js 访问网页 使用 xpath 语法操作 DOM 并打印新的 DOM libxm
  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • Sonar 中的 javascript 代码覆盖率

    我是使用 Sonar 和插件进行 javascript 代码覆盖的新手 使用 Sonar 分析时 有哪些可能性可以找出 javascript 代码的质量 包括代码覆盖率 目前我正在使用 karma runner 它提供代码覆盖率报告 可以在
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • Cosmos DB Mongo API 如何管理“请求率很大”情况

    我有以下代码 async function bulkInsert db collectionName documents try const cosmosResults await db collection collectionName
  • 将异步事件监听器与 Nestjs EventEmitter 模块和无服务器函数结合使用

    我正在尝试在 Nestjs EventEmitter 模块的帮助下实现具有无服务器 lambda 函数的异步工作线程 处理程序在发出事件时被调用 但该函数在 async await 调用之前关闭 我尝试过同时使用emit and emitA
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 自定义指令链接中的 element.replaceWith 仅在第一次调用时有效

    我是 Angularjs 的新手 不太了解幕后的情况 基本上我想创建一个 E 扭结指令 基于控制器中的数据 我动态创建html 就像整个 表 一样 以替换该指令 我的 html 文件中的指令是这样的
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

    我正在尝试过滤 FreeMarker 列表Magnolia JavaScript 模型 https documentation magnolia cms com display DOCS61 How to work with JavaScr
  • jQuery 悬停时滚动到 div 并返回到第一个元素

    我基本上有一个具有设定尺寸的 div 和overflow hidden 该 div 包含 7 个子 div 但一次只显示一个 我希望当它们各自的链接悬停时能够平滑地垂直滚动 但是 第一部分 div 没有链接 并且是没有悬停链接时的默认部分
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • p5 向量减法“sub”返回错误

    我一直在尝试将 p5 草图上传到 React 构建中 使用react p5 wrapper 我能够成功在屏幕上渲染画布 但是 某些矢量函数会导致错误 var distance this position dist ball position
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu

随机推荐

  • 对灰度 NSImage(或 CIImage)进行着色

    我有一个灰度图像 我想用它来绘制 Cocoa 控件 图像具有不同的灰度级别 在最暗的地方 我希望它绘制最暗的指定色调 我希望它在源图像是白色的地方是透明的 基本上 我想重现在 iPhone 上的 UINavigationBar 中看到的ti
  • Flutter中下拉刷新

    我的仪表板代码如下所示 这里我在 getReport 方法中做 get req 我添加了RefreshIndicator在代码中 当在容器内下拉时应该进行刷新 我正在调用我的 getData 但我没有得到刷新的内容 我在下面添加我的代码 如
  • 为什么 C++11 中需要添加尾随返回类型? [复制]

    这个问题在这里已经有答案了 我终于开始阅读c 11 questions tagged c 2b 2b11我不明白为什么需要尾随返回类型 我遇到了以下示例 该示例用于突出问题 template
  • Chrome 新标签页事件

    我想在 Chrome 中创建新选项卡时触发一个事件 我以为下面的内容可以做到这一点 但似乎不行 初学者 清单 json name My First Extension version 1 0 description The first ex
  • 如何处理服务器和客户端之间的时区?

    我正在开发一个网站 我必须处理用户可能存在的不同时区 这成为一个大问题 因为该网站举办拍卖等时间敏感的活动 服务器上的所有日期 时间均采用 UTC 格式 数据库以 UTC 时间戳存储所有内容 PHP 默认时区也设置为 UTC date de
  • 选择选项中的删除线文本

    我试图删除选择选项中的文本 但由于某种原因它不起作用 Fiddler https jsfiddle net 99x50s2s 95 https jsfiddle net 99x50s2s 95 HTML
  • NSURLSessionTask 身份验证质询完成处理程序和 NSURLAuthenticationChallenge 客户端

    我正在实施一个自定义NSURLProtocol 并且内部想要使用NSURLSession与内部网络的数据任务而不是NSURLConnection 我遇到了一个有趣的问题 想知道挑战处理程序的内部实现NSURLSession NSURLSes
  • 使用 XML 差异和合并进行版本控制

    我正在寻找一个开源版本控制工具 可以比较和合并 XML 文件 我必须找到这样一个工具的困难在于 我需要正确合并比较节点而不是行的 XML 文件 任何想法 谢谢 不幸的是 对于这个问题没有一刀切的解决方案 XML 比较对于您认为不同的内容非常
  • 为什么 C# Parallel.Invoke 很慢?

    我正在这样做 private static void Main string args var dict1 new Dictionary
  • 带有每个项目的详细信息行的 Gridview

    我是 ASP NET 新手 我有一个基本的工作网格视图 列出了公司名称 参见下面的代码 我想要做的是在每个公司下提供另一个联系人子列表 在 子列表 中缩进一点 我想以某种方式循环遍历 Gridview 数据 然后运行联系人查询 将是 Sel
  • React、Webpack 应用程序中重叠 CSS

    我使用 webpack 和 Reactjs 创建了一个应用程序 到目前为止我已经创建了 2 个页面 我已经为这两个页面定义了 CSS 样式 但是 当我在加载页面 1 后加载页面 2 时 页面 1 的样式会干扰页面 2 的样式 例如 Page
  • 绘制指数或分位数色带在零附近发散的栅格

    我正在使用 R 函数levelplot 来自rasterVis包来绘制具有单个发散色带的三个栅格的堆栈 我想更改栅格颜色渐变的比例 以便地图突出较低值的差异 这可以通过颜色中断的非线性分级来完成 我正在使用来自的代码a gist https
  • Orderer有区块(账本)数据吗?

    我使用基于 Kafka 的订购服务构建了超级账本结构网络 我以为Orderer没有Block数据 但是 当我检查 Orderer 服务器中的 var hyperledger product orderer chains mychannel
  • 无法加载为扩展“[extensionHere]”注册的类型[nameHere]

    我一直在 fx3 5 上使用 WCF 学习和构建 JSONP Web 服务 你可以阅读我在以下网站进行的一些试验 NET ASMX 返回纯 JSON https stackoverflow com questions 1903022 net
  • 为什么 pygame 上两个移动物体之间的碰撞不起作用?

    我正在用 pygame 做一个蛇游戏 游戏中有两条蛇 我想检测蛇头何时与另一条蛇身体碰撞 对两者都执行此操作 以及当两个头碰撞时的特殊情况 我目前正在做蛇头和另一条蛇身体之间的碰撞 如果其中一条蛇被冻结而另一条蛇在移动 则碰撞效果很好 但如
  • 如何在代码中定义DataTemplate?

    我怎样才能创建一个DataTemplate在代码中 使用 C 然后向其中添加一个控件DataTemplate
  • 当我的项目有同名模块时,如何从标准库导入? (如何控制 Python 寻找模块的位置?)

    我的项目文件夹中有一个名为calendar 在代码的其他地方 我想使用标准库Calendar班级 但是当我尝试导入此类时 使用from calendar import Calendar 这会从我自己的模块导入 从而导致稍后出现错误 我怎样才
  • PHP IMAP 交换问题

    所以我目前正在编写的 PHP 脚本有一个小问题 首先 我假设该脚本应该连接到 IMAP 邮箱 搜索一些电子邮件并下载其附件 所有这些都已经编码并正在使用我自己的 Gmail 帐户 当我尝试连接到交换服务器时出现问题 短代码摘录 mbox i
  • “自动测试/rails [...]不[...]存在。正在中止”

    我发现自动测试已停止工作 autotest loading autotest rails Autotest style autotest rails doesn t seem to exist Aborting 根据这篇博文 http ww
  • 一次保存多个 Backbone 模型

    我有一个包含大量模型的 Backbone 集合 每当在模型上设置特定属性并保存它时 就会触发大量计算并重新渲染 UI 但是 我希望能够同时在多个模型上设置属性 并且只有在全部设置完毕后才进行保存和重新渲染 当然 我不想为一项操作发出多个 h