我是 Backbone 的新手。

在对无法将我的一些模型添加到集合中并且有时使用 collection.get(id) 获得错误模型感到困惑之后,我发现我的模型 ID 与主干 cids 发生冲突。

我的模型 ID 类似于“c7”或“c5e6”。而后者没有问题,“c7”是集合的第七个元素的主干自己的 cid。

因此,如果我要求 collection.get('c7') 并期望 null,我反而会得到主干赋予 cid“c7”的元素。如果我添加一个 id 为 "c7"的元素,我将永远不会用 get("c7") 取回它。

我想知道我是不是第一个遇到这个问题的人,我没有找到有关主干 ID 语法限制的任何信息,有没有办法解决这个问题?作为一种解决方法,我将自己的 ID 保存在自定义属性中,并且必须使用 collection.where 而不是 collection.get

有什么更好的想法吗?

最佳答案

不幸的是,这确实看起来像一个没有真正解决方案的边缘情况问题。查看 Backbone 源代码,我们可以在 Backbone.Collection.set 方法中看到 Backbone 将您的 ID 及其内部 CID 混合在同一个对象中:

set: function(models, options) {
  // ...
  this._byId[model.cid] = model;
  if (model.id != null) this._byId[model.id] = model;
  // ...
  return this;
},
_byId 对象包含导致您出现问题的所有 ID。这是 Backbone.Collection.get 方法:
get: function(obj) {
  if (obj == null) return void 0;
  return this._byId[obj.id != null ? obj.id : obj.cid || obj];
},

当您使用不存在的 ID(您自己的)(如“c7”)调用它时, return ... 行变为 return this._byId["c7"]; 。由于 _byId 引用了您的 ID 和 Backbone 的 ID,因此您会在预期 null 时返回它们的条目。

nikoshranswer below 中有一个很好的解决方案。

关于backbone.js - 我的模型 id 与 cid 冲突(例如 : "c7" ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17655752/

10-12 06:50