2013-07-10 18 views
10

İki görünüm (sayfalama ve görüntüleme sayısı) ve koleksiyonum (postscollection) var diyelim. Ne zaman paginationview .next düğmesine tıklatıldığında, postcollection bir sonraki işlevi çağırıyorum ve post collection yeni sayfanın postaları sunucudan getiriyor (kod basitleştirilmiştir). Şimdi posta gönderiminde yalnızca son sayfada bulunan yayınları görüntülemek istiyorum. Koleksiyonumdaki 'eklenti' olayına bakışımı bağlamak istemiyorum, çünkü koleksiyona bir şeyin 'eklendiği' ile ilgili daha fazla vaka var. 'Renderlist' işlevini postview'imde görmek istiyorum, postcollection'ımda 'nextPage' işlevi çağrıldığında sadece çağrılacak. Bunları birlikte işlevlere nasıl bağlarım?Omurga Özel Olaylar

// paginationview

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

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

// toplama

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(); 
    }, 

// postsview

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); 
    }, 
}); 

cevap

13

Bu amaçla kendi olayını kullanabilirsiniz. Collection.nextPage yılında

sen olayı:

this.trigger('nextpage'); 

ve initiazlie yöntemde görünümünde Bu etkinlik için fonksiyonu bağlamak: Ayrıca

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

Ve bağlam bağlamak unutmayın Bu iş parçacığının bu işleme (yeniden başlatma yöntemine göre):

_.bindAll(this, 'render', 'rederlist'); 
+1

'this.tr' olduğunu not etmek iyi bir fikirdir. igger ('nextpage'); 'büyük olasılıkla getirme için başarı işleyicisinde olmalıdır. –

+0

Bu Andrew tarafından ne demek istiyorsun? sadece getirme başarılı olursa ne olur? aksi halde getlisteden önce render listesi çağrılabilir mi? –

+0

Evet, Andrew haklı. Getirme bitene kadar beklemeliyiz. Bu yüzden olayı başarabiliriz. –