i am working on angular13, here i have button to move items from left to right. now once the item is moved from left to right and if i edit the same item under right side, the edited value is updated in left side array as well.
HTML:
<div class="card">
<div class="card-header" id="headingBasicAgentsGroupView">
<a
href="javascript:void(0);"
class="d-block h5 mb-0"
data-target="#basicAgentsGroupView"
aria-expanded="false"
aria-controls="basicAgentsGroupView"
>Group View</a
>
</div>
<div
class=""
id="basicAgentsGroupView"
aria-labelledby="headingBasicAgentsGroupView"
data-parent="#basicTabAccordion"
>
<div class="card-body" id="agents-group-view">
<div class="row">
<div class="col">
<div class="form-group">
<h6 class="font-weight-bold">Group</h6>
</div>
</div>
<div class="col-2"></div>
<div class="col">
<div class="form-group">
<h6 class="font-weight-bold">Not in Group</h6>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="card shadow-sm border-0 swap-list list-left">
<div class="card-header border-bottom-0 rounded-top">
<div class="row">
<div class="col d-flex align-items-center">
<input
type="text"
name="SearchDualList"
class="form-control"
placeholder="Search"
/>
</div>
</div>
</div>
<div class="card-body overflow-auto py-0">
<ul
class="list-group list-group-flush"
*ngFor="let child of agentInView"
name="agentInGroup"
>
<li
class="list-group-item {{
isInActiveGroupItems(child) ? 'active' : ''
}}"
(click)="toggleActiveInGroup(child)"
>
{{ child.value }}
</li>
</ul>
</div>
</div>
</div>
<div
class="col-2 d-flex flex-column justify-content-center list-arrows"
>
<button
type="button"
class="btn btn-outline-primary my-3 move-right"
(click)="moveToTheRight()"
>
Move Right
</button>
<button
type="button"
class="btn btn-outline-primary my-3 move-left"
(click)="moveToTheLeft()"
>
Move Left
</button>
</div>
<div class="col">
<div class="card shadow-sm border-0 swap-list list-right">
<div class="card-header border-bottom-0 rounded-top">
<div class="row">
<div class="col d-flex align-items-center">
<input
type="text"
class="form-control"
placeholder="Search"
/>
</div>
</div>
</div>
<div class="card-body overflow-auto py-0">
<ul
class="list-group list-group-flush"
*ngFor="let child of agentNotinView"
name="agentNotInGroup"
>
<li
class="list-group-item {{
isInActiveNotGroupItems(child) ? 'active' : ''
}}"
(click)="toggleActiveNotInGroup(child)"
>
<input type="text" [(ngModel)]="child.value" />
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
TS:
public moveToTheRight(): void {
this.move('agentInView', 'agentNotinView');
}
public moveToTheLeft(): void {
this.move('agentNotinView', 'agentInView');
}
// moving function
public move(from: string, to: string): void {
this[from].filter((item: any, i: number) => {
if (this.isInActiveGroupItems(item)) {
this[to].push(item);
this[from].push(item);
return false;
} else {
return true;
}
});
// if needed
// sort if needed
this[to].sort((a, b) => (a.id > b.id ? 1 : -1));
// clean active items after action
this.activeItemsGroupView.length = 0;
//this.activeItemsNotInGroup.length = 0;
}
public toggleActiveInGroup(eventItem: any): void {
if (this.activeItemsGroupView.find((item) => item === eventItem)) {
this.activeItemsGroupView = this.activeItemsGroupView.filter(
(item) => item !== eventItem
);
} else {
this.activeItemsGroupView.push(eventItem);
}
}
public toggleActiveNotInGroup(eventItem: any): void {
if (this.activeItemsNotInGroup.find((item) => item === eventItem)) {
this.activeItemsNotInGroup = this.activeItemsNotInGroup.filter(
(item) => item !== eventItem
);
} else {
this.activeItemsNotInGroup.push(eventItem);
}
}
public isInActiveGroupItems(eventItem: any): boolean {
return !!this.activeItemsGroupView.find((item) => item === eventItem);
}
public isInActiveNotGroupItems(eventItem: any): boolean {
return !!this.activeItemsNotInGroup.find((item) => item === eventItem);
}
Advertisement
Answer
You are pushing the same instance into both arrays. You should create a new object at some point, so that you don’t edit the same object reference and propagate your changes in places you don’t want them. I suggest to make a new reference by using destructuring inside your move method:
// moving function
public move(from: string, to: string): void {
this[from].filter((item: any, i: number) => {
if (this.isInActiveGroupItems(item)) {
this[to].push({...item});
this[from].push(item);
return false;
} else {
return true;
}
});
// if needed
// sort if needed
this[to].sort((a, b) => (a.id > b.id ? 1 : -1));
// clean active items after action
this.activeItemsGroupView.length = 0;
//this.activeItemsNotInGroup.length = 0;
}