【问题标题】:Make a Backbone collection of models with data from a JSON file使用 JSON 文件中的数据创建模型的主干集合
【发布时间】:2014-02-28 13:56:48
【问题描述】:

我刚开始使用 Backbone.js,并认为我已经理解了它的概念。

背景故事: 我用 jQuery 和 Handlebars 做了一个交互式测验,我现在想迁移到 Backbone。 测验从同一目录中的静态 allQuestions.json 文件中读取所有问题。 该文件如下所示:

{
"Q1" : {"question": "Vem är HON-chattens true Admin?",
"choices": ["Kattigpelika", "Bangan", "Naldor"],
"correctAnswer":0},

"Q2" : {"question":"Vem är chattens true mad son?",
"choices": ["Bangan","Grev3n","Mettapod"],
"correctAnswer":1
}
ETC...

(它的格式正确,因为我以前使用过它(使用 $.getJSON)

我现在正在尝试制作模型:

var Question = Backbone.Model.extend({
initialize:function(){
    console.log("Created a model");
    }
);

这是集合的一部分:

var Questions = Backbone.Collection.extend({
model : Question,
url : "allQuestions.json"

});

我想要这个功能:

allQuestions.fetch({
success:function(){
    console.log(allQuestions);
}
});

为 .json 文件中的每个对象创建一个新模型并将其放入集合中。 这可能吗?我哪里想错了?

这一切都是在我的电脑上本地完成的。

【问题讨论】:

  • 您是否尝试过覆盖您的收藏中的“解析”功能? backbonejs.org/#Collection-parse
  • 第一次郊游做得很好(在骨干网和 SO 中)。听起来这都是本地的(即没有网络服务器)。正确的?问题是让文件加载还是加载时没有解析?
  • 是的,都是本地的。我将在我的帖子中澄清这一点。问题是整个 .json 文件被加载到集合中的单个模型中。我希望 .json 文件中的每个对象都成为集合中的单个模型。

标签: javascript json backbone.js handlebars.js


【解决方案1】:

这里的问题不是 Backbone,而是 JSON 对象的结构。如果您可以将其修改为这样的内容,它将为每个问题加载不同的模型:

[
 {
  "id": "Q1", 
  "question": "Vem är HON-chattens true Admin?",
  "choices": ["Kattigpelika", "Bangan", "Naldor"],
  "correctAnswer":0 
 },
 {
  "id": "Q2", 
  "question":"Vem är chattens true mad son?",
  "choices": ["Bangan","Grev3n","Mettapod"],
  "correctAnswer":1
 }
]

您可以在JSFiddle 中检查它是否有效。

【讨论】:

  • JSON 的格式不是要求一切都是对象吗?我记得第一个版本的测验有一个数组中的问题,但是当我将数据移动到 .json 文件并使用 .getJSOn 检索它时,这不起作用。
  • 据我了解,每个问题都是一个对象,因此是一个主干模型,而您传递给主干集合的则是一个对象数组。
  • 这实际上解决了我原来的问题。感谢您的帮助,因为我自己从来没有看过实际的 JSON 代码。
【解决方案2】:

理想情况下,您可以将数据放在 Web 服务器发送的视图中并加载(参见 http://backbonejs.org/#FAQ-bootstrap)。

否则,您需要重新定义您的集合的 sync 方法,以便如果该方法是“读取”的,您调用 $.getJSON,否则您像往常一样调用 Backbone.sync

【讨论】:

  • 这一切都是在本地完成的,所以没有网络服务器。我正在研究集合的同步和解析方法,我认为这是我能够解决我的问题的地方。谢谢你。 (如果我解决了问题,回来标记这个。)
  • 解析不起作用:当您已经拥有数据时会调用它。但是您可以查看我关于 Backbone Marionette (leanpub.com/marionette-gentle-introduction) 的书的代码 (github.com/davidsulc/marionette-gentle-introduction) ,但它没有后端,因此可以在本地部署相同:通过在 github 上下载代码来尝试):davidsulc.github.io/marionette-gentle-introduction
  • 关于 parse 的第一句话让我大吃一惊,这种编码真的需要另一种思维方式。你的 Marionette-git 绝对会解决我的问题,这正是我想要的。非常感谢。
  • 一旦你了解它就非常简单:sync 与服务器交互,parse 处理接收到的数据,toJSON 准备发送数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多