实体事件订阅清理

时间:2018-05-17 19:59:00

标签: javascript typescript memory memory-leaks breeze

我正在使用BreezeJS。假设我们有一个自定义EntityBase类并订阅了一些entityAspect个事件(propertyChangedvalidationErrorsChanged)和/或其集合属性的事件({{1在其实体初始化方法中(下面的示例在TypeScript中):

arrayChanged

这意味着在实体分离之间和之前收集的数据之间的某个时间点,我们必须取消订阅这些事件以防止内存泄漏。所以我们需要一个实体终结器/析构函数。

在Breeze API中,我没有在实体生命周期中看到任何明显的插件点。

有人可以知道如何执行此操作吗?

1 个答案:

答案 0 :(得分:0)

好的,我想我明白这个问题。但是为了确保让我重述此问题并添加一些上下文。分离实体后,除非您单独对其进行引用,否则它将收集垃圾。此垃圾回收还将收集对每个实体的“ entityAspect”进行的所有订阅。因此,您看到泄漏(在垃圾回收之后)的唯一方法是,如果对某个对象的订阅与实体本身(或它的EntityAspect)保持分开。就您而言,尚不清楚您定义的EntityBase处理程序是静态的还是实例级别的,但是如果是静态的,则需要取消订阅。

为此,Breeze EntityManager具有一个entityChanged event,可以像这样使用:

var em = new EntityManager( {serviceName: "api/NorthwindIBModel" });
em.entityChanged.subscribe(function(changeArgs) {
    // This code will be executed any time any entity within the entityManager is added, 
    // modified, deleted or detached for any reason. 
    var action = changeArgs.entityAction;
    var entity = changeArgs.entity;
    // unsubscribe here if detaching.
});

这有意义吗?