Ember组件清理代码

时间:2016-03-25 08:47:39

标签: ember.js

想象一下,在网页中有更多的组件呈现,当我点击一个链接时,我会转到主页,这将填满整个页面。 (表示UI中所有组件都已消失)

我应该确保清理以避免内存泄漏的所有内容是什么?

几个例子:

如果我在组件Ember.addObserver中使用了didInsertElement,我应该使用Ember.removeObserver方法中的willDestroyElement将其删除。

任何附加的事件处理程序都应该分离。

我可以获得更多示例/链接,看看我应该清理的所有内容以及在哪里?

1 个答案:

答案 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插件,如果你非常不幸使用其中一个。

如果出于任何原因您正在使用计时器,您可能需要在退出时取消它们。