0

次のコードは、フェッチが完了する前に AccItemList コレクションの「リセット」イベントが発生しているように見せます。このためのコンソールへの出力は次のとおりです...

レンダリング

0

取ってきた

0

...そのため、コレクションにモデルが存在する前に「render」が呼び出されますが、これは明らかに間違っていますが、フェッチ成功のコールバックでも紛らわしいことに、コレクションにモデルがないようです。ルーター初期化子で AccItemList コレクションのインスタンス化も試みましたが、違いはありませんでした。私は何か基本的なことが欠けていると確信しています。助けてください、これは私を夢中にさせています!

$(function () {

    var AccItem = Backbone.Model.extend({
        defaults: {}
    });

    var AccItemList = Backbone.Collection.extend({
        model: AccItem,
        url: "/Dashboard/Accommodation",
        parse: function (response) {
            this.add(response.AccItems);
        }
    });

    var AccListView = Backbone.View.extend({
        el: $("#temp"),
        initialize: function () {
            _.bindAll(this, 'render', 'renderAccItem');
            this.collection = new AccItemList();
            this.collection.on('reset', this.render);
            var that = this;
            that.collection.fetch({
                success: function () {
                    console.log("fetched");
                    console.log(that.collection.models.length);
                }
            });
        },
        render: function () {
            var that = this;
            console.log("rendering");
            console.log(this.collection.models.length);
        }
    });

    var App = Backbone.Router.extend({
        routes: {
            "": "index"
        },
        index: function () {
        },
        init: function () {
            var accItemView = new AccListView();
        }
    });

    var app = new App();
    app.init();

});
4

1 に答える 1

6

では、手動でモデルを追加し、 Backbone docの状態AccItemList.parse以外は何も返さない

parse collection.parse(応答)

parse は、コレクションのモデルがサーバーによってフェッチで返されるたびに、Backbone によって呼び出されます。この関数には生の応答オブジェクトが渡され、コレクションに追加されるモデル属性の配列を返す必要があります。デフォルトの実装はノーオペレーションであり、JSON レスポンスを通過するだけです。既存の API を使用する必要がある場合、または応答の名前空間を改善する必要がある場合は、これをオーバーライドします。その後、モデル クラスに解析関数が既にある場合は、フェッチされた各モデルに対して実行されることに注意してください。

試す

var AccItemList = Backbone.Collection.extend({
    model: AccItem,
    url: "/Dashboard/Accommodation",
    parse: function (response) {
        return response.AccItems;
    }
});

コードと修正版をシミュレートする Fiddle : http://jsfiddle.net/nikoshr/Q25dp/

リセット イベントと成功のコールバックが呼び出される順序は、バックボーン ソースの実際の実装に依存します。http://documentcloud.github.com/backbone/docs/backbone.html#section-98を参照してください。

var success = options.success;
options.success = function(resp, status, xhr) {
    //reset call
    collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);

    //custom success call
    if (success) success(collection, resp);
};
于 2012-09-19T09:12:58.873 に答える