Backbone:继承模型不在带ID的Collection中工作

时间:2013-08-03 15:30:51

标签: inheritance backbone.js backbone-collections backbone-model

我遇到了这个问题,因为我认为我对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子模型之间的全局变量?

感谢

感谢您的阅读和任何帮助:)。

1 个答案:

答案 0 :(得分:3)

当你应该处理一个实例(例如RunnableList)时,你正试图直接在列表原型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/

一起玩的小提琴

请注意,您不应该设置默认ID:如果您创建多个实例而不指定ID,则可能会发生冲突(至少在您将其添加到集合时)。

您可以使用second argument of extend添加共享变量,但是必须处理DOM的模型通常被认为是可疑的。