Skip to content

Commit 7c215bf

Browse files
committed
fix: notify both onchange if proxy is passed into proxy
1 parent 7fc930a commit 7c215bf

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

packages/svelte/src/internal/client/constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const HEAD_EFFECT = 1 << 19;
2222
export const EFFECT_HAS_DERIVED = 1 << 20;
2323

2424
export const STATE_SYMBOL = Symbol('$state');
25+
export const PROXY_ONCHANGE_SYMBOL = Symbol('proxy onchange');
2526
export const STATE_SYMBOL_METADATA = Symbol('$state metadata');
2627
export const LEGACY_PROPS = Symbol('legacy props');
2728
export const LOADING_ATTR_SYMBOL = Symbol('');

packages/svelte/src/internal/client/proxy.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from '../shared/utils.js';
1111
import { check_ownership, widen_ownership } from './dev/ownership.js';
1212
import { source, set, state, batch_onchange } from './reactivity/sources.js';
13-
import { STATE_SYMBOL, STATE_SYMBOL_METADATA } from './constants.js';
13+
import { PROXY_ONCHANGE_SYMBOL, STATE_SYMBOL, STATE_SYMBOL_METADATA } from './constants.js';
1414
import { UNINITIALIZED } from '../../constants.js';
1515
import * as e from './errors.js';
1616
import { get_stack } from './dev/tracing.js';
@@ -33,7 +33,13 @@ export function proxy(value, options, parent = null, prev) {
3333
stack = get_stack('CreatedAt');
3434
}
3535
// if non-proxyable, or is already a proxy, return `value`
36-
if (typeof value !== 'object' || value === null || STATE_SYMBOL in value) {
36+
if (typeof value !== 'object' || value === null) {
37+
return value;
38+
}
39+
40+
if (STATE_SYMBOL in value) {
41+
// @ts-ignore
42+
value[PROXY_ONCHANGE_SYMBOL] = options?.onchange;
3743
return value;
3844
}
3945

@@ -237,6 +243,14 @@ export function proxy(value, options, parent = null, prev) {
237243
},
238244

239245
set(target, prop, value, receiver) {
246+
if (prop === PROXY_ONCHANGE_SYMBOL && options?.onchange != null) {
247+
const old_onchange = options.onchange;
248+
options.onchange = () => {
249+
old_onchange();
250+
value();
251+
};
252+
return true;
253+
}
240254
var s = sources.get(prop);
241255
var has = prop in target;
242256

0 commit comments

Comments
 (0)