2014-03-19 79 views
2

昨天我得到了這個奇怪的事情。我嘗試了幾次來解決這個問題。當我兩次返回頁面時,我的應用會觸發多次警報,取決於我訪問頁面的次數。我已經通過這個網站和互聯網對這種「殭屍」和內存缺乏做了一些研究,但是我發現了死路一條。已經有2天無法解決這個問題。警報觸發多次backbonejs窗口

我的代碼

查看頁面

initialize: function() { 
    $(window).scroll(function() { 
     if ($(window).scrollTop() + $(window).height() == $(document).height()) { 
      alert("bottom!"); 
     } 
    }); 
    this.bind("reset", this.updateView()); 
}, 
render: function() { 
    this.$el.html(notificationListViewTemplate); 
}, 
updateView: function() { 
    console.log("clear"); 
    this.remove(); 
    this.render(); 
} 

路由器

showNotificationList: function(actions) { 
    var notificationListView = new NotificationListView(); 
    this.changePage(notificationListView); 
}, 

爲什麼發生?

回答

1

調用View.remove確實會undelegate事件由視圖設置

刪除 view.remove()
刪除從DOM視圖,並調用的stopListening刪除該視圖有listenTo任何綁定事件倒是。

,但它只能這樣做就可以瞭解事件:由事件哈希或設置者通過調用this.listenTo

您設置一個滾動監聽器,但你從來沒有將其刪除,這意味着過去意見將繼續傾聽:看到你的困境http://jsfiddle.net/nikoshr/E6MQ6/

的這個演示在這種情況下,你無法通過重寫remove方法使用事件的哈希所以你要好好清理自己的照顧,例如:

var V = Backbone.View.extend({ 
    initialize: function() { 
     $(window).scroll(function() { 
     if ($(window).scrollTop() + $(window).height() == $(document).height()) { 
      console.log("bottom!"); 
     } 
     }); 
    }, 
    render: function() { 
    }, 
    updateView: function() { 
     console.log("clear"); 
     this.remove(); 
     this.render(); 
    }, 
    remove: function() { 
     Backbone.View.prototype.remove.call(this); 
     $(window).off('scroll'); // for example, will remove all listeners of the scroll event 
    } 
}); 

並演示http://jsfiddle.net/nikoshr/E6MQ6/1/

和稍微少殘酷去除滾動事件,通過使用命名空間的聽衆:

var V = Backbone.View.extend({ 
    initialize: function() { 
     $(window).on('scroll.'+this.cid, function() { 
      ... 
     }); 
    }, 
    remove: function() { 
     Backbone.View.prototype.remove.call(this); 
     $(window).off('scroll.'+this.cid); 
    } 
}); 

http://jsfiddle.net/nikoshr/E6MQ6/2/

+0

感謝,它的工作原理! –

+2

另一個不那麼殘酷的可能性是使用$(window).on('scroll',this.pancakes)'命名的方法',這樣你就可以'$(window).off('scroll',this.pancakes) '。 –