我遇到了这个问题,因为我认为我对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 ...
现在我想拥有一个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的集合(为了运行),然后我想在创建我的Checkboxes集合时通过ID引用每个。当Checkbox模型被“选中”/“取消选中”时,他们将通知Runnable,后者将通知其他收听复选框。
如何将'template'变量作为所有Runnable子模型之间的全局变量?
感谢您的阅读和任何帮助:)。
答案 0 :(得分:3)
当你应该处理一个实例(例如RunnableList
)时,你正试图直接在列表原型new RunnableList()
上工作。尝试
var lst = new RunnableList();
lst.push(new RunnableSubModel({id: 'mySubModel', alwaysOn: true}));
var mySubModel = lst.get('mySubModel');
mySubModel.run();
一起玩的小提琴
请注意,您不应该设置默认ID:如果您创建多个实例而不指定ID,则可能会发生冲突(至少在您将其添加到集合时)。
您可以使用second argument of extend
添加共享变量,但是必须处理DOM的模型通常被认为是可疑的。