我遇到了这个问题,因为我认为我对 Backbone 的理解不正确。
我有一个名为 Runnable 的超类和一组从它继承的子类:
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 ...
现在我想要一个可运行子模型的集合,我可以通过 ID 获取并调用新的运行方法:
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 对象之一。问题是多个 Checkboxes 可以引用同一个 Runnable 实例。为了做到这一点,我有 Runnables 的集合(为了运行),然后我想在创建我的复选框集合时按 ID 引用每个。当 Checkbox 模型被“选中”/“未选中”时,它们将通知 Runnable,后者将依次通知其他正在侦听的 Checkbox。
边注
如何让“模板”变量成为所有 Runnable 子模型之间的全局变量?
谢谢
感谢您的阅读和任何帮助:)。