Skip to content

Commit ccd3534

Browse files
authored
Merge pull request #7243 from QwikDev/v2-signal-prop-qrl
fix: wait for QRL to resolve for signal attribute
2 parents 93e5664 + a5d6d7e commit ccd3534

File tree

5 files changed

+64
-31
lines changed

5 files changed

+64
-31
lines changed

Diff for: .changeset/silly-nails-own.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/core': patch
3+
---
4+
5+
fix: wait for QRL to resolve for signal attribute

Diff for: packages/qwik/src/core/use/use-core.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
ResourceEvent,
1212
TaskEvent,
1313
} from '../shared/utils/markers';
14-
import { isPromise } from '../shared/utils/promises';
14+
import { isPromise, retryOnPromise } from '../shared/utils/promises';
1515
import { seal } from '../shared/utils/qdev';
1616
import { isArray } from '../shared/utils/types';
1717
import { setLocale } from './use-locale';
@@ -263,7 +263,7 @@ export const trackSignalAndAssignHost = (
263263
if (value instanceof WrappedSignal && value.$hostElement$ !== host && host) {
264264
value.$hostElement$ = host;
265265
}
266-
return trackSignal(() => value.value, host, property, container, data);
266+
return retryOnPromise(() => trackSignal(() => value.value, host, property, container, data));
267267
};
268268

269269
/** @internal */

Diff for: starters/apps/e2e/src/components/attributes/attributes.e2e.tsx

-28
This file was deleted.

Diff for: starters/apps/e2e/src/components/attributes/attributes.tsx

+48-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { component$, useSignal, useStore } from "@qwik.dev/core";
1+
import {
2+
$,
3+
Slot,
4+
component$,
5+
useComputed$,
6+
useSignal,
7+
useStore,
8+
type PropsOf,
9+
} from "@qwik.dev/core";
210

311
export const Attributes = component$(() => {
412
const render = useSignal(0);
@@ -13,6 +21,7 @@ export const Attributes = component$(() => {
1321
Rerender
1422
</button>
1523
<AttributesChild v={render.value} key={render.value} />
24+
<ProgressParent />
1625
</>
1726
);
1827
});
@@ -214,3 +223,41 @@ export const Issue4718Null = component$(() => {
214223
</button>
215224
);
216225
});
226+
227+
const ProgressRoot = component$<{ min?: number } & PropsOf<"div">>((props) => {
228+
const { ...rest } = props;
229+
230+
const minSig = useComputed$(() => props.min ?? 0);
231+
232+
const valueLabelSig = useComputed$(() => {
233+
const value = minSig.value;
234+
return `${value * 100}%`;
235+
});
236+
237+
return (
238+
<div aria-valuetext={valueLabelSig.value} {...rest}>
239+
<Slot />
240+
</div>
241+
);
242+
});
243+
244+
const ProgressParent = component$(() => {
245+
const minGoal = useSignal(2000);
246+
247+
const incrementMin = $(() => {
248+
minGoal.value += 500;
249+
});
250+
251+
return (
252+
<div>
253+
<div>
254+
<span id="progress-value">${minGoal.value}</span>
255+
<button id="progress-btn" onClick$={incrementMin}>
256+
+
257+
</button>
258+
</div>
259+
260+
<ProgressRoot min={minGoal.value}>Test</ProgressRoot>
261+
</div>
262+
);
263+
});

Diff for: starters/e2e/e2e.attributes.e2e.ts

+9
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,15 @@ test.describe("attributes", () => {
295295
await expect(button).not.toHaveAttribute("aria-label");
296296
await expect(button).not.toHaveAttribute("title");
297297
});
298+
299+
test("should update var prop QRL signal value", async ({ page }) => {
300+
const button = page.locator("#progress-btn");
301+
await button.click();
302+
const progress = page.locator("#progress-value");
303+
await expect(progress).toHaveText("$2500");
304+
await button.click();
305+
await expect(progress).toHaveText("$3000");
306+
});
298307
}
299308

300309
tests();

0 commit comments

Comments
 (0)