Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 主干:继承的模型在ID为的集合中不起作用_Inheritance_Backbone.js_Backbone.js Collections_Backbone Model - Fatal编程技术网

Inheritance 主干:继承的模型在ID为的集合中不起作用

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() {

我遇到了这个问题,因为我认为我理解不正确

我有一个名为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获取并调用新的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();