1

我最近才开始使用 Backbone.js,我正在开发一个应用程序,现在使用 Brunch 向外部 API 发出 JSONP 请求以填充我的集合和模型。我正在关注这些以前的帖子(thisthis)关于使用 Backbone 执行 JSONP 请求,但由于某种原因,我的集合仍然没有获取数据。

我的模型(app/models/model.js):

module.exports = Backbone.Model.extend({
});

我的收藏(app/models/collection.js):

var Post = require('./model');

module.exports = Backbone.Collection.extend({
    model: Post,
    url: "http://somedata.com/api/posts/list/stuff",
    sync: function(method, model, options) {  
        options.timeout = 10000;
        options.dataType = "jsonp";
        options.jsonp = "JSONPcallback";        
        return Backbone.sync(method, model, options);
    },
    parse: function(response) {
        if (response) {
            var parsed = [];
            for(var i = 0; i < response.results.length; i++) {
                parsed.push(response.results[i][0]);
            }

            return parsed;
        }
    }
});

然后,在 app/application.js 的初始化方法中,我通过以下方式调用它:

var Category = require('models/collection');
this.cat = new Category();
this.cat.fetch();

现在,当我查看 console.log 中的 parse 函数时,我看到正在获取数据,因此请求成功通过。但是,当我的视图被渲染并且我在 app/views/view.js 中执行 console.log(application.cat.models) 时,我什么也得不到——为什么会这样?我的模型/系列上的代码有什么问题吗?

此外,JSONP 数据具有以下格式,这就是为什么遍历 for response.results[i][0] 并返回一个包含所有数据的数组,这应该可以解决问题,对吧?

{"results":[
  {"0":{"id":xxx,"title":xxx,"link":xxx},
   "description":xxx},
  {"0":{"id":xxx,"title":xxx,"link":xxx},
   "description":xxx},
  {"0":{"id":xxx,"title":xxx,"link":xxx},
   "description":xxx},...
]}

非常感谢任何帮助...

4

1 回答 1

2

我在这里有 2 条评论:

  1. 我看到您将模型和集合都命名为module.exports,一种常见的做法是将模型设为单数(module.export)并将这些模型的集合设为复数module.exports,这只是常见的做法,否则没有任何“错误”

  2. 您的代码中可以有 2 个回调,当集合完成获取数据(异步事件)时,还考虑将 module.exports 作为您的集合,

A. 你可以这样做:

module.exports.fetch({
success : function(data){
console.log(JSON.stringiy(data));
//do remaining programming here
}
});

B. 你可以有一个事件监听器reset,从这里的文档中,集合在完成获取时触发一个reset事件,所以可以像这样在集合上添加一个事件监听器:

module.exports.on('reset',function(data){
console.log(JSON.stringify(data));
//do remaining programming here
},this);
于 2013-02-10T13:16:06.880 回答