如何选择性地从主干集合和服务器中删除模型
How do you selectively remove models from a Backbone collection and from the server?
例如,如果要从todo列表中删除已完成的todo。
有选择地从主干集合和服务器中删除模型似乎是一项常见的任务。常见的方法是什么?每种方法的成本和收益是什么?
解决方案一
var toRemove = collection.filter(function(model) {
return condition(model);
});
_.invoke(toRemove, 'destroy');
这似乎是最干净的方式。这就是Addy在他的书中用来删除已完成的todo的方法(这也是我首先列出这个解决方案的一个重要原因)。如果你重复使用过滤功能(就像他一样),它会特别干净。
然而,我认为它比解决方案二慢,因为它涉及在collection
和toRemove
上的迭代,而解决方案二只涉及在collection
上的迭代。尽管如此,它们都有线性运行时间,所以这并不是什么大不了的事。
解决方案二
for (var i = collection.models.length-1; i >= 0; i--) { // looping from back to front
var model = collection.models[i];
if (condition(model)) model.destroy();
}
我觉得这个比较干净。如上所述,这样做的好处是只需循环遍历集合,而不必循环遍历集合+经过过滤的集合版本。
从后到前循环很重要。考虑一下当你从前到后循环时会发生什么:
for (var i = 0; i < collection.models.length; i++) { // looping from front to back
var model = this.models[i];
if (condition(model)) {
model.destroy();
i--;
}
}
当你破坏一个模型时,collection.models
中的模型基本上会上移一个。这有两个含义:
数组的长度减少一。
假设您删除了元素二。下一个元素将是四个,而不是三个。索引增加到3,由于模型上移了1,所以3的索引为2,4的索引为3。
解决方案:
在循环的每次迭代之后计算
collection.models.length
。Ie.for (var i = 0; i < **collection.models.length**; i++)
销毁模型后递减
i
。
你可以从前到后循环,但你只需要解决这些问题,这会使它变得有点复杂。
解决方案三
var toRemove = [];
collection.forEach(function(model) {
if (condition(model)) toRemove.push(model);
});
toRemove.forEach(function(model) {
model.destroy();
});
这与解决方案一非常相似。
差异:
我们使用
forEach
来构建toRemove
而不是filter
。我们手动迭代并调用
destroy
,而不是使用invoke
。
与解决方案一一样,您必须遍历collection
和toRemove
,因此可能需要比解决方案二更长的时间。
注意:我们不能在第一个forEach
循环中破坏模型。如果我们这样做,那么它的问题与解决方案2中的从前到后循环相同。为了绕过这个限制,我们必须使用toRemove
数组。
解决方案四
这使用reset()
+reset
事件。
var toKeep = collection.filter(function(model) {
return condition(model);
});
collection.reset(toKeep);
和
collection.on('reset', function(after, before) {
// let after.length = k
// let before.length = n
after.sort(); // k*logk
for (var i = before.length-1; i >= 0; i--) { // n
var model = before[i];
if (!binarySearch(model, after)) model.remove(); // logk
}
// total runtime: n*logk + k*logk
});
这对我来说似乎有点过分,但这是一种选择。
- 正在使用Dropzone.js删除服务器上已重命名的文件
- 从服务器中删除映射数据,丢失订阅
- 如何选择性地从主干集合和服务器中删除模型
- 如何使用fine Uploader通过删除选项将上传的文件名传递到服务器端
- 如何在调用服务器请求时删除错误
- 如何从服务器中查找和删除临时数据
- 如何在将文件发送到服务器之前删除文件
- Openfire 会在一天后删除 pub sub 节点(而不是在服务器重新启动或删除缓存后)
- 通过我的应用程序删除驻留在内部 Linux 服务器上的文件
- 当我们使用 ajax post 请求上传文件时,如何取消将文件上传到服务器并删除文件(在上传未完成之间)
- 向访问者显示图像并从服务器中删除该图像(在同一页面加载时)
- 为什么删除响应在 webdav 服务器中没有 cors 标头
- 简单的“删除工作表/插入工作表”脚本上的服务器错误
- 无法使用 Froala 编辑器删除服务器的图像
- 如何从 Node.js 访问、检索、存储和删除文件到远程文件服务器中
- 取消链接代码以从服务器中删除文件的位置
- 如何从服务器中删除文件
- 如何在客户端获取服务器删除/更新收集项的 ID
- redips.拖动 获取行 ID 删除并发送到服务器
- Dropzonejs with Rails -从服务器删除文件