0

this.collection.each()バックエンドから取得したコレクションを反復処理するために使用しています。

問題:resetコレクションのイベントをrenderメソッド内のビューのメソッドにバインドし、内に をinitialize配置すると、期待どおりにコンソール出力が表示されることに気付きました。console.log()this.collection.each

ただし、上記のバインディングを行わず、単にthis.render()withininitializeを使用すると、console.log()は何も出力しません。これは私には本当に奇妙に思えます。誰か説明してもらえますか?

console.log(this.collection);ループの直前にも配置しましたが、これは常にコレクションを正しく出力します! ビューの初期化時にコレクションが取り込まれていないと推測していましたが、それによりconsole.log(this.collection);何も表示されなくなります。

この作品

SimilarPhotoListView = Backbone.View.extend({
    el: '#modal_similar_items',

    initialize: function() {
        this.collection.on('reset', this.render, this);
    },

    render: function() {
        console.log(this.collection);
        this.collection.each(function(photo, index) {
            console.log('hello');
        }, this);
        return this;
    }
});

this.collection.each() 内からは出力されません

SimilarPhotoListView = Backbone.View.extend({
    el: '#modal_similar_items',

    initialize: function() {
        this.render();
    },

    render: function() {
        console.log(this.collection);
        this.collection.each(function(photo, index) {
            console.log('hello');
        }, this);
        return this;
    }
});

両方のクラスは、次の方法でインスタンス化されます。

renderSimilarPosts: function() {
    this.similarPhotoList = new SimilarPhotoCollection();
    this.similarPhotoListView = new SimilarPhotoListView({ collection: this.similarPhotoList });
    this.similarPhotoList.fetch({
        data: {post_id: this.model.id},
        processData: true
    });
}
4

2 に答える 2

1

ビューを初期化するthis.similarPhotoListと、空のコレクションになります。したがって、を作成するときはsimilarPhotoListView、空のコレクションを渡します。したがって、 は、コレクションが によって移入される前に、すべて空のコレクションでsimilarPhotoListView.initialize呼び出します。renderfetch

最初の方法が機能する理由は、resetでトリガーされるためですcollection.fetch。バックボーン ソースから:

fetch:
...
    options.success = function(resp, status, xhr) {
            collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
            if (success) success(collection, resp);
          };
...
于 2012-07-10T14:21:19.947 に答える
0

initializeインスタンス化で実行されるためrender、コレクションを渡す前に実行します。さらに、renderから直接呼び出すべきではありませんinitialize

于 2012-07-10T14:25:17.093 に答える