From 55a76a3b91ce4ec8ca229a6deea3a9dc4facb224 Mon Sep 17 00:00:00 2001 From: Vanessa Schmitt Date: Wed, 12 Aug 2020 11:51:25 -0700 Subject: [PATCH] fix(ListKeyManager): Unset activeItem if it is removed from items If the items QueryList changes such the previous activeItem is no longer in it, reset activeItem and activeItemIndex to null and -1. This will allow code like: if (keyManager.activeItem) { // Do something with the active item } to work properly by not operating on an item that has been removed. --- src/cdk/a11y/key-manager/list-key-manager.spec.ts | 12 ++++++++++++ src/cdk/a11y/key-manager/list-key-manager.ts | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/cdk/a11y/key-manager/list-key-manager.spec.ts b/src/cdk/a11y/key-manager/list-key-manager.spec.ts index 849db859841b..0230efc4391c 100644 --- a/src/cdk/a11y/key-manager/list-key-manager.spec.ts +++ b/src/cdk/a11y/key-manager/list-key-manager.spec.ts @@ -114,6 +114,18 @@ describe('Key managers', () => { expect(keyManager.activeItem).toBeNull(); }); + it('should reset the activeItem to null if it is removed from the QueryList', () => { + expect(keyManager.activeItemIndex).toBe(0); + expect(keyManager.activeItem!.getLabel()).toBe('one'); + + itemList.items.splice(0); + itemList.notifyOnChanges(); + + expect(keyManager.activeItemIndex).toBe(-1); + expect(keyManager.activeItem).toBeNull(); + + }); + describe('Key events', () => { it('should emit tabOut when the tab key is pressed', () => { diff --git a/src/cdk/a11y/key-manager/list-key-manager.ts b/src/cdk/a11y/key-manager/list-key-manager.ts index c3e4a135e56a..771e9a53bec6 100644 --- a/src/cdk/a11y/key-manager/list-key-manager.ts +++ b/src/cdk/a11y/key-manager/list-key-manager.ts @@ -72,6 +72,9 @@ export class ListKeyManager { if (newIndex > -1 && newIndex !== this._activeItemIndex) { this._activeItemIndex = newIndex; + } else { + this._activeItemIndex = -1; + this._activeItem = null; } } });