Inheritance 主干:继承的模型在ID为的集合中不起作用
我遇到了这个问题,因为我认为我理解不正确 我有一个名为Runnable的超类和一组继承自它的子类:Inheritance 主干:继承的模型在ID为的集合中不起作用,inheritance,backbone.js,backbone.js-collections,backbone-model,Inheritance,Backbone.js,Backbone.js Collections,Backbone Model,我遇到了这个问题,因为我认为我理解不正确 我有一个名为Runnable的超类和一组继承自它的子类: var Runnable = Backbone.Model.extend({ template: $("#template"), defaults: function(){ return { id: '', alwaysOn: false, } } run: function() {
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获取并调用新的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()方法
很明显,我对继承如何在主干网中工作(或应该如何工作)做出了错误的假设,但实际上找不到任何全面的解释
答复 解决方案是使用lst.push([obj]) 这应该是第一次添加([obj,obj,…])或第一次推送(obj) 主干是聪明的,并回落到父对象(Runnable)
上下文 我可能以错误的方式执行任务(因为这是我的第一个OOP/Backbone js项目:D) 我有两个集合之间的一对多映射。第一个是表示GUI复选框的模型集合。然后,每个对象都引用一个可运行对象。问题是多个复选框可以引用同一个可运行实例。为了做到这一点,我有了可运行的集合(为了运行),然后我想在创建复选框集合时通过ID引用每个可运行的集合。当复选框模型被“选中”/“取消选中”时,它们将通知Runnable,Runnable将依次通知其他侦听复选框 旁注 如何使“模板”变量成为所有可运行子模型之间的全局变量 谢谢
感谢您的阅读和帮助:)。您正在尝试直接处理列表原型,
RunnableList
,此时您应该处理实例(new RunnableList()
)。试一试
还有一把小提琴
请注意,不应设置默认id:如果在不指定id的情况下创建多个实例(至少在将它们添加到集合时),可能会发生冲突
您可以使用添加共享变量,但是必须处理DOM的模型通常被认为是可疑的。谢谢nikoshr。不幸的是,我有一个输入错误,我没有说new RunnableList(),抱歉(来自requirejs的concat)。然而,实际的解决方案是使用lst.push([obj]);这应该是第一次添加([obj,obj,…])或第一次推送(obj);。主干是聪明的,并回落到父对象!其次我知道在模型中使用DOM有99%的时间是不正确的。但是,在这种罕见的情况下,DOM的这一部分是模型,与任何视图对象都是分离的。
var lst = new RunnableList();
lst.push(new RunnableSubModel({id: 'mySubModel', alwaysOn: true}));
var mySubModel = lst.get('mySubModel');
mySubModel.run();