Skip to content

Commit f077e45

Browse files
asynclizcopybara-github
authored andcommitted
chore(labs): use async directive for cleanup
PiperOrigin-RevId: 897881313
1 parent c86e3a2 commit f077e45

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

labs/gb/components/button/button.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ import {
1414
setupRipple,
1515
} from '@material/web/labs/gb/components/ripple/ripple.js';
1616
import {PSEUDO_CLASSES} from '@material/web/labs/gb/components/shared/pseudo-classes.js';
17-
import {AttributePart} from 'lit';
18-
import {Directive, directive, DirectiveParameters} from 'lit/directive.js';
17+
import {
18+
AsyncDirective,
19+
AttributePart,
20+
directive,
21+
DirectiveParameters,
22+
} from 'lit/async-directive.js';
1923
import {classMap, type ClassInfo} from 'lit/directives/class-map.js';
2024

2125
/** Button color configuration types. */
@@ -170,7 +174,7 @@ export interface ButtonDirectiveState extends ButtonClassesState {
170174
classes?: ClassInfo;
171175
}
172176

173-
class ButtonDirective extends Directive {
177+
class ButtonDirective extends AsyncDirective {
174178
private element?: HTMLElement;
175179
private cleanup?: AbortController;
176180

@@ -185,15 +189,25 @@ class ButtonDirective extends Directive {
185189
{element}: AttributePart,
186190
[state]: DirectiveParameters<this>,
187191
) {
188-
if (element !== this.element) {
192+
if (this.isConnected && element !== this.element) {
189193
this.element = element as HTMLElement;
190-
this.cleanup?.abort();
191-
this.cleanup = new AbortController();
192-
setupButton(this.element, {signal: this.cleanup.signal});
194+
this.disconnected();
195+
this.reconnected();
193196
}
194197

195198
return this.render(state);
196199
}
200+
201+
protected override disconnected() {
202+
this.cleanup?.abort();
203+
}
204+
205+
protected override reconnected() {
206+
if (this.element) {
207+
this.cleanup = new AbortController();
208+
setupButton(this.element, {signal: this.cleanup.signal});
209+
}
210+
}
197211
}
198212

199213
/**

labs/gb/components/checkbox/checkbox.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ import {
1010
setupRipple,
1111
} from '@material/web/labs/gb/components/ripple/ripple.js';
1212
import {PSEUDO_CLASSES} from '@material/web/labs/gb/components/shared/pseudo-classes.js';
13-
import {AttributePart} from 'lit';
14-
import {Directive, directive, DirectiveParameters} from 'lit/directive.js';
13+
import {
14+
AsyncDirective,
15+
AttributePart,
16+
directive,
17+
DirectiveParameters,
18+
} from 'lit/async-directive.js';
1519
import {classMap, type ClassInfo} from 'lit/directives/class-map.js';
1620

1721
/** Checkbox classes. */
@@ -92,7 +96,7 @@ export interface CheckboxDirectiveState extends CheckboxClassesState {
9296
classes?: ClassInfo;
9397
}
9498

95-
class CheckboxDirective extends Directive {
99+
class CheckboxDirective extends AsyncDirective {
96100
private element?: HTMLElement;
97101
private cleanup?: AbortController;
98102

@@ -107,15 +111,25 @@ class CheckboxDirective extends Directive {
107111
{element}: AttributePart,
108112
[state]: DirectiveParameters<this>,
109113
) {
110-
if (element !== this.element) {
114+
if (this.isConnected && element !== this.element) {
111115
this.element = element as HTMLElement;
112-
this.cleanup?.abort();
113-
this.cleanup = new AbortController();
114-
setupCheckbox(this.element, {signal: this.cleanup.signal});
116+
this.disconnected();
117+
this.reconnected();
115118
}
116119

117120
return this.render(state);
118121
}
122+
123+
protected override disconnected() {
124+
this.cleanup?.abort();
125+
}
126+
127+
protected override reconnected() {
128+
if (this.element) {
129+
this.cleanup = new AbortController();
130+
setupCheckbox(this.element, {signal: this.cleanup.signal});
131+
}
132+
}
119133
}
120134

121135
/**

0 commit comments

Comments
 (0)