1

最近Backbone.jsの使用を開始し、現在、Brunchを使用して外部APIへのJSONPリクエストを実行してコレクションとモデルにデータを入力するアプリに取り組んでいます。Backboneを使用してJSONPリクエストを実行することについて、これらの以前の投稿(thisおよびthis)をフォローしていますが、何らかの理由でコレクションがまだデータを取得していません。

私のモデル(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のinitializeメソッドで、次のように呼び出しています。

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

ここで、console.logの解析関数を見ると、データがフェッチされているのがわかり、リクエストは正常に処理されています。ただし、ビューがレンダリングされ、app / views / view.jsでconsole.log(application.cat.models)を実行すると、何も表示されません。これはなぜ発生するのでしょうか。モデル/コレクションのコードに何か問題がありますか?

また、JSONPデータの形式は次のとおりです。そのため、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 に答える