我正在使用BreezeJS。假设我们有一个自定义EntityBase
类并订阅了一些entityAspect
个事件(propertyChanged
,validationErrorsChanged
)和/或其集合属性的事件({{1在其实体初始化方法中(下面的示例在TypeScript中):
arrayChanged
这意味着在实体分离之间和之前收集的数据之间的某个时间点,我们必须取消订阅这些事件以防止内存泄漏。所以我们需要一个实体终结器/析构函数。
在Breeze API中,我没有在实体生命周期中看到任何明显的插件点。
有人可以知道如何执行此操作吗?
答案 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.
});
这有意义吗?