想象一下,在网页中有更多的组件呈现,当我点击一个链接时,我会转到主页,这将填满整个页面。 (表示UI中所有组件都已消失)
我应该确保清理以避免内存泄漏的所有内容是什么?
几个例子:
如果我在组件Ember.addObserver
中使用了didInsertElement
,我应该使用Ember.removeObserver
方法中的willDestroyElement
将其删除。
任何附加的事件处理程序都应该分离。
我可以获得更多示例/链接,看看我应该清理的所有内容以及在哪里?
答案 0 :(得分:3)
理想的是编写代码,以便不需要清理。
例如,如果将观察者定义为
observeWhatever: Ember.observer('whatever', function() {...
不需要特别拆卸。同样,如果将事件处理程序定义为
click: function(event) { ...
然后不需要拆卸。但是,如果您想在组件中的某个元素上侦听DOM事件,该怎么办?我们经常看到那些不记得他们是用Ember编程还是jQuery的人做的事情如下:
setupWhatever: function() {
Ember.$('.foo.bar.baz').on('click', function() { alert('baz clicked!'); });
}.on('init')
这几乎是一种反模式,而不仅仅是因为它需要被拆除。如何引用应用程序的各个部分,以及如何设置回调以及如何处理操作完全是混乱的。你所指的.foo.bar.baz
应该是它自己的组件,它在组件级别设置自己的监听器。它会发送一个动作,按如下方式处理:
{{foo-bar-baz action=(action 'bazClicked')}}
actions: {
bazClicked() { alert('baz clicked'); }
...
}
如果要设置挂钩,例如
listen: Ember.on('message', function() ...
也将被拆除。
如果我在组件的
Ember.addObserver
中使用didInsertElement
,我应该使用Ember.removeObserver
方法中的willDestroyElement
将其删除。
你会在didInsertElement
设置什么样的观察者?过度使用didInsertElement
也是一种反模式。如果你正确使用Ember,几乎没有必要。一个可能的例外是初始化一个jQuery插件,如果你非常不幸使用其中一个。
如果出于任何原因您正在使用计时器,您可能需要在退出时取消它们。