1

我在这个视图中有一个间隔

var QuestionsView = Backbone.View.extend({
    render: function(){
        var view = this;
        this.updateQuestionsIntervalId = setInterval(function() {view.refreshQuestionLists()}, 3000);
    ),

    refreshQuestionLists: function() {
        this.questions.fetch({ 
            ...
        });
    },

    navigateAway: function() {
        clearInterval(this.updateQuestionsIntervalId);
    }

}); 

理想情况下,我想QuestionView.navigateAway()在路线改变时跑步。无论如何我可以做到这一点吗?

谢谢

4

2 回答 2

1

作为一个省力的解决方案,您可以将视图方法直接绑定到router:route事件,每次路由器将 URL 更改匹配到任何定义的路由时都会触发该事件:

var QuestionsView = Backbone.View.extend({
  initialize: function(){
    this.listenTo(yourRouter, 'route', this.navigateAway); 
  )
}); 

这应该有效,但对我来说感觉就像意大利面条。

我通常onBeforeClose在我的视图上实现一个方法,我在离开当前视图之前调用它。类似于:

var Router = Backbone.Router.extend({
  navigateToView: function(view) {
    //I've actually abstracted this logic to a separate
    //view manager class, but you get the idea...
    var current = this.currentView; 
    if(current) {
      if(current.onBeforeClose)
        current.onBeforeClose();
      current.remove();
    }

    this.currentView = view;
    //render your current view here, however you like
    $(body).html(this.currentView.render().el);
  },

  someRoute: function() {
    var view = new SomeView();
    this.navigateToView(view);
  }
});

这更像是一种约定。如果一个视图没有onBeforeClose方法,它就不会被调用,也不会造成任何伤害。

请注意,这要求您使用一种集中式方法(navigateToView在本例中)呈现您的视图,但这是一件好事,因为您应该使用remove无论如何清理旧视图。

于 2013-02-05T12:18:21.840 回答
0

我需要这样做的原因是通过停止前一个间隔来停止从呈现视图时开始的多个间隔。

但我至少需要一个跑步...

于是我走错了路,解决办法:

var QuestionsView = Backbone.View.extend({

    updateQuestionsIntervalId: false,

    render: function(){
        var view = this;

        if(this.updateQuestionsIntervalId == false)
            this.updateQuestionsIntervalId = setInterval(function() {view.refreshQuestionLists()}, 3000);
    ),

    refreshQuestionLists: function() {
        this.questions.fetch({ 
            ...
        });
    }

}); 
于 2013-02-05T12:40:21.100 回答