gpt4 book ai didi

javascript - 使用 MVC/Backbone.js 实现复合模式

转载 作者:可可西里 更新时间:2023-11-01 02:42:44 26 4
gpt4 key购买 nike

我的网络应用程序具有复合结构,即每个类别集合可以包含单个项目和其他类别的混合作为其行/节点/子项(不确定此处的正确术语)。实际上,它比这要简单一点,因为每个集合都由一个模型 Category 表示,因此基本上每个 Category 集合都有 Item 模型和 Category 模型作为其子模型。

一般来说,这是使用 MVC 实现此结构的可取方法吗?更具体地说,在 Backbone.js 中,集合是否可以拥有模型工厂(获取 json 并根据 json 的结构计算生成哪个模型)而不是静态模型属性?

最佳答案

我假设您正在接收一个 JSON 格式的类别/项目列表,看起来像这样......

{
'id': 1,
'name': 'My 1st Category',
'children': [
{
'id': 2,
'name': 'My 2nd Category',
'children': []
},
{
'id': 1,
'name': 'An Item',
'price': 109.99
}
]
}

Backbone.js 没有开箱即用的功能支持集合中的多个模型,但它对放入集合中的模型类型也没有任何限制。

在集合定义中指定模型类型只做一件事,如果您将原始 JSON 而不是 Backbone.Model 对象传递给集合,它会让 Backbone 知道要创建什么模型类型。如果您将 Item 模型添加到已经包含一些 Category 模型的集合中,Backbone 将毫无问题地将其弹出到模型列表中;它不进行任何类型检查。

因此,考虑到这一点,您可以使用该集合提供的几乎所有内容,除了将原始 JSON 传递给它;你需要自己处理。因此,您的选择是要么预先构建您的模型,将它们变成 Backbone.Model 对象,要么创建一些可以为您进行解析的东西。

对于第二个选项,解析器,我建议将一个特殊变量传递给包含原始 JSON 的集合,然后在 initialize 函数中处理它。这是一个例子:

var CategoryCollection = Backbone.Collection.extend({
initialize: function(m, models) {
_.each(models, function(model) {
var modelObject = null;
if (model.price !== undefined) {
modelObject = new Item(model);
} else {
modelObject = new Category(model);
}

this.add(modelObject);
}, this);
}
});

所以有点hacky,但你可以根据模型是否有特定字段(在我的例子中是price)来确定模型的类型,创建模型对象,然后将其添加到集合中.

然后你可以这样调用它:

var myCollection = new CategoryCollection([], myJSON);

请注意,您必须传递一个空数组作为第一个参数,因为这通常是您将一组模型传递给集合的方式。

稍后在使用集合时,您可以使用简单的 instanceof 检查来确定您正在处理的是 Item 还是 Category:

_.each(myCollection.models, function(model) {
if (model instanceof Item) {
console.log("It's an Item! Price: ", model.get("price"));
} else {
console.log("It's a Category!");
}
});

关于javascript - 使用 MVC/Backbone.js 实现复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8887440/

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