11

2 つのビュー (paginationview と postsview) とコレクション (postscollection) があるとします。paginationview で .next ボタンがクリックされるたびに、postscollection で次の関数を呼び出しており、post コレクションはサーバーから新しいページの投稿を取得しています (コードは簡略化されています)。投稿ビューでは、最後のページにある投稿のみを表示したいと考えています。コレクションに何かが「追加」されるケースが多いため、ビューをコレクションの「追加」イベントにバインドしたくありません。投稿コレクションで「nextPage」関数が呼び出されたときにのみ、postsview の「renderlist」関数が呼び出されるようにします。これらを関数に接続するにはどうすればよいですか?

// ページネーションビュー

var PaginationView = Backbone.View.extend({
    events:{
        'click a.next' : 'next',
    },

    next: function() {
        this.collection.nextPage();
        return false;
    }
});

// コレクション

var PostsCollection = Backbone.Collection.extend({
    model: model,

    initialize: function() {
        _.bindAll(this, 'parse', 'url', 'pageInfo', 'nextPage', 'previousPage');
        this.page = 1;
        this.fetch();
    },

    parse: function(response) {
        console.log(response);
        this.page = response.page;
        this.perPage = response.perPage;
        this.total = response.total;
        this.noofpages =response.noofpages;
        return response.posts;
    },

    url: function() {
        return '/tweet/' + '?' + $.param({page: this.page});
    },

    nextPage: function() {
        console.log("next page is called");
        this.page = this.page + 1;
        this.fetch();
    },

// ポストビュー

var PostsView = Backbone.View.extend({
    events:{
        'click #testbutton' : 'test',
        'click #allbutton' : 'render',
    },

    initialize: function() {
        this.listenTo(this.collection, 'add', this.addOne);
    },

    render: function() {
        $(".maincontainer").html("");
        this.collection.forEach(this.addOne, this);
        return this;
    },

    renderlist: function(){
        $(".maincontainer").html("");
        this.collection.forEach(this.addOne, this);
    },

    addOne: function(post) {
        var post = new postView({model : post});
        post.render();
        this.$el.prepend(post.el);
    },
});
4

1 に答える 1

14

この目的のために、独自のイベントを使用できます。

Collection.nextPage で、イベントを発生させます。

this.trigger('nextpage');

initiazlie メソッドのビューでは、関数をこのイベントにバインドします。

this.listenTo(this.collection, 'nextpage', this.renderlist);

また、renderlist のコンテキストをこれにバインドすることも忘れないでください (ビューの初期化メソッドで):

_.bindAll(this, 'render', 'rederlist');
于 2013-07-10T21:55:09.433 に答える