[英]Entity event subscriptions clean-up
我正在使用BreezeJS。 假设我们有一个自定义的EntityBase
类,并在其实体初始化器方法(以下示例在TypeScript中)中订阅了一些entityAspect
事件( propertyChanged
, validationErrorsChanged
)和/或其集合属性的事件( arrayChanged
):
import { Entity, EntityAspect } from "breeze-client";
export abstract class EntityBase implements Entity {
public static initializer(entity: EntityBase): void {
const entityAspect: EntityAspect = entity.entityAspect;
entityAspect.propertyChanged.subscribe(EntityBase.propertyChangedHandler);
entityAspect.validationErrorsChanged.subscribe(EntityBase.validationErrorHandler);
}
}
export class Contact extends EntityBase {
/// [Initializer]
public static initializer(entity: EntityBase): void {
super.initializer(entity);
(entity as Contact).addresses.arrayChanged.subscribe(Contact.addressesChangedHandler);
}
/// </code>
// Generated code. Do not place code below this line.
public addresses: Address[];
}
// Somewhere where MetadataStore is initialized.
metadataStore.registerEntityTypeCtor("Contact", Contact, Contact.initializer);
这意味着在实体分离到垃圾被收集之前的某个时间点,我们必须取消订阅这些事件,以防止内存泄漏。 因此,我们有点需要实体终结器/析构函数。
我在Breeze API中没有看到任何明显的插件插入实体生命周期。
有人可以提出如何执行此操作的想法吗?
好吧,我想我明白这个问题。 但是为了确保让我重述此问题并添加一些上下文。 分离实体后,除非您单独对其进行引用,否则它将收集垃圾。 此垃圾回收还将收集对每个实体的“ entityAspect”进行的所有订阅。 因此,您看到泄漏(在垃圾回收之后)的唯一方法是,如果对某个对象的订阅与实体本身(或它的EntityAspect)保持分开。 就您而言,尚不清楚您定义的EntityBase处理程序是静态的还是实例级别的,但是如果是静态的,则需要取消订阅。
为此,Breeze EntityManager具有一个EntityChanged事件 ,可以按如下方式使用该事件 :
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.
});
这有意义吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.