diff --git a/packages/@ember/-internals/meta/lib/meta.ts b/packages/@ember/-internals/meta/lib/meta.ts index 9f38cb7f77c..867d3488317 100644 --- a/packages/@ember/-internals/meta/lib/meta.ts +++ b/packages/@ember/-internals/meta/lib/meta.ts @@ -594,14 +594,9 @@ export class Meta { } else { let listener = listeners[i]; - // If the listener is our own function listener and we are trying to - // remove it, we want to splice it out entirely so we don't hold onto a - // reference. - if ( - kind === ListenerKind.REMOVE && - listener.kind !== ListenerKind.REMOVE && - typeof method === 'function' - ) { + // If the listener is our own listener and we are trying to remove it, we + // want to splice it out entirely so we don't hold onto a reference. + if (kind === ListenerKind.REMOVE && listener.kind !== ListenerKind.REMOVE) { listeners.splice(i, 1); } else { assert( diff --git a/packages/@ember/-internals/meta/tests/listeners_test.js b/packages/@ember/-internals/meta/tests/listeners_test.js index 2e1ca9898be..17232a7602b 100644 --- a/packages/@ember/-internals/meta/tests/listeners_test.js +++ b/packages/@ember/-internals/meta/tests/listeners_test.js @@ -172,5 +172,31 @@ moduleFor( 'one reopen call after mutating parents and flattening out of order' ); } + + '@test removed listeners are removed from the underlying structure GH#1112213'(assert) { + // Ensure counter is zeroed + class Class1 {} + let class1Meta = meta(Class1.prototype); + class1Meta.addToListeners('hello', null, 'm', 0); + + let instance1 = new Class1(); + let m1 = meta(instance1); + + function listenerFunc() {} + + m1.removeFromListeners('hello', null, 'm', 0); + + m1.addToListeners('stringListener', null, 'm', 0); + m1.addToListeners('functionListener', null, listenerFunc, 0); + + m1.removeFromListeners('functionListener', null, listenerFunc, 0); + m1.removeFromListeners('stringListener', null, 'm', 0); + + assert.equal( + m1.flattenedListeners().length, + 1, + 'instance listeners correctly removed, inherited listeners remain' + ); + } } );