3

我遇到了这个问题,因为我认为我对 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 ...

现在我想要一个可运行子模型的集合,我可以通过 ID 获取并调用新的运行方法:

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 对象之一。问题是多个 Checkboxes 可以引用同一个 Runnable 实例。为了做到这一点,我有 Runnables 的集合(为了运行),然后我想在创建我的复选框集合时按 ID 引用每个。当 Checkbox 模型被“选中”/“未选中”时,它们将通知 Runnable,后者将依次通知其他正在侦听的 Checkbox。

边注

如何让“模板”变量成为所有 Runnable 子模型之间的全局变量?

谢谢

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

4

1 回答 1

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(至少在将它们添加到集合时),您可能会遇到冲突。

你可以使用第二个参数extend来添加一个共享变量,但是必须处理 DOM 的模型通常被认为是可疑的。

于 2013-08-03T16:09:37.993 回答