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

我有一个名为 Runnable 的父类(super class)和一组从它继承的子类:

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 的集合(为了运行),然后我想在创建复选框集合时通过 ID 引用每个集合。当复选框模型被“选中”/“未选中”时,它们将通知 Runnable,后者又将通知其他监听复选框。

边注

如何让"template"变量成为所有 Runnable 子模型之间的全局变量?

谢谢

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

最佳答案

当您应该处理实例(例如 RunnableList )时,您正尝试直接处理列表原型(prototype) 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/ 一起玩的 fiddle

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

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

关于inheritance - 主干 : Inherited Models not working in Collection with ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18034384/

10-12 20:00