我正在构建一个响应式 Web 框架,该架构全部基于 Backbone.js。计划是让它最终开源,并让外部开发人员能够修改和编辑模型上的方法。在编写临时插件时,我注意到我的方法没有被覆盖。
经过调试,我意识到这是因为在集合中设置模型属性时,它不是指向构造函数的指针,而是在定义集合时直接引用构造函数。到目前为止,我已经设法通过在模型扩展后立即扩展集合的模型属性(使用与以前完全相同的数据)来修补这个问题。这似乎是 Backbone 中的一个普遍缺陷,还是我用错了。
var MyModel = Backbone.Model.extend({
initialize: function() {
this.set("type", "original");
}
})
var MyCollection = Backbone.Collection.extend({
model: MyModel
})
MyModel = MyModel.extend({
initialize: function() {
this.set("type", "modified");
}
})
var test = new MyCollection();
test.add({type:null})
test.at(0).get("type") // original
MyCollection = MyCollection.extend({
model: MyModel
})
var test2 = new MyCollection();
test2.add({type:null})
test2.at(0).get("type") // modified
对于外部开发人员来说,重新定义包含他们已覆盖的模型类型的任何集合的模型属性似乎有点错误/多余。
任何想法或解决方法将不胜感激。或者这是一个真正的缺陷?我已经包含了一个 jsfiddle http://jsfiddle.net/S4pcW/1/,我不确定它有多大帮助,因为它只是代码但是如果你在backbonejs.org上将它复制并粘贴到chrome开发人员工具中你应该明白我的意思。
在此先感谢,任何想法将不胜感激。