From ee833881da3ecaa0a9153397f0c7e62c1923f19c Mon Sep 17 00:00:00 2001
From: Sean Perkins <13732623+sean-perkins@users.noreply.github.com>
Date: Wed, 1 May 2024 13:26:16 -0400
Subject: [PATCH] fix(angular): set active segment button when dynamically
changing items (#29418)
Issue number: resolves #29414
---------
## What is the current behavior?
In Angular when the segment buttons are dynamically rendered, the
segment will not set the active visual state for the selected segment
after the re-render.
## What is the new behavior?
- In Angular the segment will set the active item visually when the
items are dynamically changed
Previously this PR:
https://github.com/ionic-team/ionic-framework/pull/28837 aimed to
resolve https://github.com/ionic-team/ionic-framework/issues/28816. I
have confirmed that the modified approach in the dev-build fixes #29414
and #28816 and the previous change is no longer needed.
## Does this introduce a breaking change?
- [ ] Yes
- [x] No
## Other information
Dev-build: `8.0.2-dev.11714411675.10f48160`
---
core/src/components/segment/segment.tsx | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/core/src/components/segment/segment.tsx b/core/src/components/segment/segment.tsx
index 4b7913d76b..4c425e18b2 100644
--- a/core/src/components/segment/segment.tsx
+++ b/core/src/components/segment/segment.tsx
@@ -141,14 +141,6 @@ export class Segment implements ComponentInterface {
async componentDidLoad() {
this.setCheckedClasses();
- /**
- * If the value changes before watchers
- * are setup, then the ionSelect watch callback
- * will not fire. As a result, we manually
- * fire this event when Select is loaded.
- */
- this.ionSelect.emit({ value: this.value });
-
/**
* We need to wait for the buttons to all be rendered
* before we can scroll.
@@ -495,6 +487,15 @@ export class Segment implements ComponentInterface {
}
};
+ private onSlottedItemsChange = () => {
+ /**
+ * When the slotted segment buttons change we need to
+ * ensure that the new segment buttons are checked if
+ * the value matches the segment button value.
+ */
+ this.valueChanged(this.value);
+ };
+
private getSegmentButton = (selector: 'first' | 'last' | 'next' | 'previous'): HTMLIonSegmentButtonElement | null => {
const buttons = this.getButtons().filter((button) => !button.disabled);
const currIndex = buttons.findIndex((button) => button === document.activeElement);
@@ -573,7 +574,7 @@ export class Segment implements ComponentInterface {
'segment-scrollable': this.scrollable,
})}
>
-
+
);
}