Skip to content

Commit 502ea35

Browse files
authored
Merge pull request #2930 from koenvd/optimize_dropdown_propagate_selected
fix: Optimize propagateSelected by limiting matching items to the selected ones (#2929)
2 parents d063bd0 + a855e4b commit 502ea35

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

src/dropdown/list/dropdown-list.component.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -445,24 +445,38 @@ export class DropdownList implements AbstractDropdownView, AfterViewInit, OnDest
445445
console.error(`${this.constructor.name}.propagateSelected expects an Array<ListItem>, got ${JSON.stringify(value)}`);
446446
}
447447
this.onItemsReady(() => {
448+
const selectedNewItems = [];
449+
for (let newItem of value) {
450+
if (newItem && newItem.selected) {
451+
// copy the item
452+
let tempNewItem: string | ListItem = Object.assign({}, newItem);
453+
// deleted selected because it's what we _want_ to change
454+
delete tempNewItem.selected;
455+
// stringify for compare later
456+
tempNewItem = JSON.stringify(tempNewItem);
457+
// add to the list of selected items
458+
selectedNewItems.push(tempNewItem);
459+
}
460+
}
461+
448462
// loop through the list items and update the `selected` state for matching items in `value`
449463
for (let oldItem of this.getListItems()) {
464+
// fast path when no items are selected
465+
if (selectedNewItems.length === 0) {
466+
oldItem.selected = false;
467+
continue;
468+
}
469+
450470
// copy the item
451471
let tempOldItem: string | ListItem = Object.assign({}, oldItem);
452472
// deleted selected because it's what we _want_ to change
453473
delete tempOldItem.selected;
454474
// stringify for compare
455475
tempOldItem = JSON.stringify(tempOldItem);
456-
for (let newItem of value) {
457-
// copy the item
458-
let tempNewItem: string | ListItem = Object.assign({}, newItem);
459-
// deleted selected because it's what we _want_ to change
460-
delete tempNewItem.selected;
461-
// stringify for compare
462-
tempNewItem = JSON.stringify(tempNewItem);
476+
for (let selectedNewItem of selectedNewItems) {
463477
// do the compare
464-
if (tempOldItem.includes(tempNewItem)) {
465-
oldItem.selected = newItem.selected;
478+
if (tempOldItem.includes(selectedNewItem)) {
479+
oldItem.selected = true;
466480
// if we've found a matching item, we can stop looping
467481
break;
468482
} else {

0 commit comments

Comments
 (0)