我是 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
时返回它们的条目。nikoshr 在 answer below 中有一个很好的解决方案。
关于backbone.js - 我的模型 id 与 cid 冲突(例如 : "c7" ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17655752/