我遇到了这个问题,因为我认为我对 Backbone 的理解不正确。
我有一个名为 Runnable 的父类(super class)和一组从它继承的子类:
var Runnable = Backbone.Model.extend({
template: $("#template"),
defaults: function(){
return {
id: '',
alwaysOn: false,
}
}
run: function() {
}
});
var RunnableSubModel = Runnable.extend({
run: function() {
//do some custom stuff here
}
});
... any many more runnable sub models ...
现在我想要一个 Runnable 子模型的集合,我可以通过 ID 获取并调用新的 run 方法:
var RunnableList = Backbone.Collection.extend({
model: Runnable,
run: function() {
this.each(function(runnable) {
runnable.run();
});
}
});
RunnableList.push([
new RunnableSubModel({id: 'mySubModel', alwaysOn: true})
]);
//POST EDIT (forgot this)
var lst = new RunnableList();
//doesn't work, looks for Runnable id value
var mySubModel = lst.get('mySubModel');
//doesn't work, looks at Runnable.run() not RunnableSubModel.run()
mySubModel.run();
但是,这并不像我预期的那样工作。
id 属性不会在任何地方设置,只有在 Runnable 中的默认值发生更改时才会更改(使其无用!)。
mySubModel 上的 run 方法从父模型调用 Runnable.run(),而不是 RunableSubModel 中覆盖的 run() 方法。
我显然对 Backbone 中的继承如何工作(或应该如何工作)做出了错误的假设,但实际上找不到任何全面的解释。
回答
解决方案是我使用的是 lst.push([obj]);
这应该是 lst.add([obj,obj,..]) 或 lst.push(obj);。
Backbone 很聪明并且回退到父对象(Runnable)!
语境
我可能会以错误的方式执行我的任务(因为这是我的第一个 OOP/Backbone js 项目:D)。
我有两个集合之间的一对多映射。第一个是代表 GUI 复选框的模型集合。然后每个都引用 Runnable 对象之一。问题是多个 Checkbox 可以引用同一个 Runnable 实例。为了做到这一点,我拥有 Runnables 的集合(为了运行),然后我想在创建复选框集合时通过 ID 引用每个集合。当复选框模型被“选中”/“未选中”时,它们将通知 Runnable,后者又将通知其他监听复选框。
边注
如何让"template"变量成为所有 Runnable 子模型之间的全局变量?
谢谢
感谢您的阅读和任何帮助:)。
最佳答案
当您应该处理实例(例如 RunnableList
)时,您正尝试直接处理列表原型(prototype) new RunnableList()
。尝试
var lst = new RunnableList();
lst.push(new RunnableSubModel({id: 'mySubModel', alwaysOn: true}));
var mySubModel = lst.get('mySubModel');
mySubModel.run();
和 http://jsfiddle.net/NwmHr/1/ 一起玩的 fiddle
请注意,您不应设置默认 id:如果您创建多个实例而未指定 id(至少在将它们添加到集合时),则可能会发生冲突。
您可以使用 second argument of
extend
添加共享变量,但必须处理 DOM 的模型通常被认为是可疑的。关于inheritance - 主干 : Inherited Models not working in Collection with ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18034384/