fix(core): always remove DOM listeners and stream subscriptions
This is needed to prevent memory leaks. The DOM listeners don’t need to be removed for simple examples, but a big internal app shows memory leaks because of them. BREAKING CHANGE: - `Renderer.listen` now has to return a function that removes the event listener.
This commit is contained in:
@@ -1267,7 +1267,7 @@ export function main() {
|
||||
|
||||
val.changeDetector.dehydrate();
|
||||
expect(() => {val.changeDetector.detectChanges()})
|
||||
.toThrowErrorWith("Attempt to detect changes on a dehydrated detector");
|
||||
.toThrowErrorWith("Attempt to use a dehydrated detector");
|
||||
expect(val.dispatcher.log).toEqual(['propName=Bob']);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -877,13 +877,22 @@ function declareTests() {
|
||||
var listener = tc.inject(DirectiveListeningEvent);
|
||||
|
||||
expect(listener.msg).toEqual('');
|
||||
var eventCount = 0;
|
||||
|
||||
ObservableWrapper.subscribe(emitter.event, (_) => {
|
||||
expect(listener.msg).toEqual('fired !');
|
||||
async.done();
|
||||
eventCount++;
|
||||
if (eventCount === 1) {
|
||||
expect(listener.msg).toEqual('fired !');
|
||||
fixture.destroy();
|
||||
emitter.fireEvent('fired again !');
|
||||
} else {
|
||||
expect(listener.msg).toEqual('fired !');
|
||||
async.done();
|
||||
}
|
||||
});
|
||||
|
||||
emitter.fireEvent('fired !');
|
||||
|
||||
});
|
||||
}));
|
||||
|
||||
@@ -961,6 +970,11 @@ function declareTests() {
|
||||
.toEqual(
|
||||
['domEvent', 'body_domEvent', 'document_domEvent', 'window_domEvent']);
|
||||
|
||||
fixture.destroy();
|
||||
listener.eventTypes = [];
|
||||
dispatchEvent(tc.nativeElement, 'domEvent');
|
||||
expect(listener.eventTypes).toEqual([]);
|
||||
|
||||
async.done();
|
||||
});
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user