我的应用程序实现了大量的dropzone元素。通过导航,我实现了Dropzone,但是当用户离开其他页面时,我需要正确处理Dropzones以保持我的文档事件/ DOM清洁。
我在骨干/ requirejs应用程序中使用了Dropd的amd版本。
文档说调用disable()方法删除所有dropzone事件侦听器。我调用disable方法,然后从DOM中删除元素。这是正确清洁Dropzone的安全方法吗? Dropzone模块是否仍然保留对此删除的Dropzone元素的引用?
这是我用来渲染dropzone元素的代码"作为视图"在我的骨干应用程序中我需要制作"删除"功能正确清理Dropzone实例:
define(['backbone','dropzone-amd-module'], function(Backbone, Dropzone){
// Prevent Dropzone from auto discovering this element:
Dropzone.options.myAwesomeDropzone = false;
// This is useful when you want to create the
// Dropzone programmatically later
// Disable auto discover for all elements:
Dropzone.autoDiscover = false;
return Backbone.View.extend({
tagName: 'div',
className: 'dropzone',
dropzone_reference: null,
render: function(){
this.initDropzone();
return this;
},
initDropzone: function(){
// init dropzone (avoid to init more than once!)
if( !this.dropzone_reference)this.dropzone_reference = new Dropzone(this.el, this.options);
},
remove: function(){
// remove dropzone instance
this.dropzone_reference.disable();
Backbone.View.prototype.remove.apply(this, arguments);
}
});
}
答案 0 :(得分:1)
Backbones view.remove()
:
remove: function() {
this._removeElement();
this.stopListening();
return this;
},
从DOM中删除视图的元素。
正如你所说,drop方法确实删除了事件处理程序:
如果您不再需要dropzone,只需在对象上调用.disable()即可。这将删除元素上的所有事件侦听器
由于view.remove()
从DOM中删除了元素本身,所以即使.disable()
也没有必要。
引用dropzone模块的唯一内容是视图的dropzone_reference
属性。当没有对视图的引用时,它将被垃圾收集,使dropzone模块没有引用,这将反过来收集垃圾。
请确保不要对已销毁的视图进行任何引用。