2

私はbackbone.jsのPaginationプラグインを使用して、Twitterのように無限スクロール機能を作成しようとしています。ボタン/リンクをクリックする#pagination aと、バックエンドから結果の次のページが読み込まれ、現在のビューに追加されますPhotoListView

問題:ここでプラグインの例に従い、ここでソースを取得しようとしていますdataこれまでのところ、リンクをクリックするとバックエンドからJSONデータを取得できます#pagination a

ビューのボタンがクリックされたときに、backbone.jsのモデルビューバインディングを使用photoListItemViewして、ビューに新しいビューを追加するにはどうすればよいですか?photoListView#pagination aPaginationView

this.collection.requestNextPage()メソッドappendRenderinpaginationViewが呼び出されると、新しく取得されたモデルがコレクションに追加され、のイベントトリガーphotoCollectionがトリガーされ、新しく取得されたモデルが追加されると思いましたか?photoListViewthis.collection.bind('change', this.render, this);

ビュー

PhotoListView = Backbone.View.extend({
    el: '#photo_list',

    initialize: function() {
        this.collection.bind('change', this.render, this);
        this.collection.bind('add', function() {
            console.log('added to collection');
        }, this);
    },

    render: function() {
        //$(this.el).html('');
        this.collection.each(function(photo, index) {
            if(index % 7 < 3) {
                $(this.el).append(new PhotoListItemView({ model: photo }).render().el);
            } else {
                $(this.el).append(new PhotoListQuadItemView({ model: photo }).render().el);
            }
            console.log('render');
        }, this);
        return this;
    }
});

PhotoListItemView = Backbone.View.extend({
    tagNAme: 'div',
    className: 'photo_box',

    template: _.template( $('#tpl_PhotoListItemView').html() ),

    initialize: function() {
        this.model.bind('destroy', this.close, this);
    },

    render: function() {
        $(this.el).html( this.template( this.model.toJSON() ) );
            console.log('render item');
        return this;
    },

    close: function() {
        this.unbind();
        this.remove();
    }
});

PhotoListQuadItemView = Backbone.View.extend({
    tagNAme: 'div',
    className: 'photo_box',

    template: _.template( $('#tpl_PhotoListQuadItemView').html() ),

    initialize: function() {
        this.model.bind('destroy', this.close, this);
    },

    render: function() {
        $(this.el).html( this.template( this.model.toJSON() ) );
        return this;
    },

    close: function() {
        this.unbind();
        this.remove();
    }
});

PaginationView = Backbone.View.extend({
    el: $('#pagination'),

    events: {
        'click #pagination a': 'appendRender'
    },

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

    template: _.template( $('#tpl_pagination').html() ),

    render: function() {
        $(this.el).html( this.template() );
    },

    appendRender: function() {
        this.collection.requestNextPage()
            .done(function(data, textStatus, jqXHR) {
                // HOW DO I APPEND THE NEW DATA VIEWS?
        });
    }
});

コレクション

PhotoCollection = Backbone.Paginator.requestPager.extend({
    model: Photo,

    paginator_core: {
            dataType: 'json',
            url: 'http://www.domain.com/explore/all?'
        },

    paginator_ui: {
        firstPage: 1,
        currentPage: 1,
        perPage: 7,
        totalPages: 10
    },

    server_api: {
        '$page': function() { return this.currentPage; }
    },

    parse: function (response) {
        return response;
    }

});

ルーター

var AppRouter = Backbone.Router.extend({
    routes: {
        '': 'explore'
    },

    initialize: function() {

    },

    explore: function() {
        console.log('explore!');
        this.photoList = new PhotoCollection();
        this.paginationView = new PaginationView({ collection: this.photoList });
        var self = this;
        this.photoList.fetch({
            success: function() {
                self.photoListView = new PhotoListView({ collection: self.photoList });
                self.photoListView.render();

            }
        });
    }

});

var app = new AppRouter();
Backbone.history.start();
4

1 に答える 1

0

キショアが言ったように。イベントにバインドされ、reset現在機能しています。

于 2012-07-11T02:57:14.353 に答える