gpt4 book ai didi

inheritance - Backbone : Inherited Models not working in Collection with ID

转载 作者:行者123 更新时间:2023-12-02 00:06:40 25 4
gpt4 key购买 nike

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

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

旁注

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

谢谢

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

最佳答案

当您应该处理实例(例如 new RunnableList())时,您正在尝试直接处理列表原型(prototype) RunnableList。尝试

var lst = new RunnableList();
lst.push(new RunnableSubModel({id: 'mySubModel', alwaysOn: true}));
var mySubModel = lst.get('mySubModel');
mySubModel.run();

还有一个可以玩的 fiddle http://jsfiddle.net/NwmHr/1/

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com