File tree 3 files changed +49
-20
lines changed 3 files changed +49
-20
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' svelte ' : patch
3
+ ---
4
+
5
+ fix: reconnected deep derived signals to graph
Original file line number Diff line number Diff line change @@ -171,8 +171,17 @@ export function check_dirtiness(reaction) {
171
171
172
172
if ( dependencies !== null ) {
173
173
var is_unowned = ( flags & UNOWNED ) !== 0 ;
174
+ var i ;
175
+
176
+ if ( ( flags & DISCONNECTED ) !== 0 ) {
177
+ for ( i = 0 ; i < dependencies . length ; i ++ ) {
178
+ ( dependencies [ i ] . reactions ??= [ ] ) . push ( reaction ) ;
179
+ }
174
180
175
- for ( var i = 0 ; i < dependencies . length ; i ++ ) {
181
+ reaction . f ^= DISCONNECTED ;
182
+ }
183
+
184
+ for ( i = 0 ; i < dependencies . length ; i ++ ) {
176
185
var dependency = dependencies [ i ] ;
177
186
178
187
if ( check_dirtiness ( /** @type {import('#client').Derived } */ ( dependency ) ) ) {
@@ -771,25 +780,6 @@ export function get(signal) {
771
780
if ( check_dirtiness ( derived ) ) {
772
781
update_derived ( derived ) ;
773
782
}
774
-
775
- if ( ( flags & DISCONNECTED ) !== 0 ) {
776
- // reconnect to the graph
777
- deps = derived . deps ;
778
-
779
- if ( deps !== null ) {
780
- for ( var i = 0 ; i < deps . length ; i ++ ) {
781
- var dep = deps [ i ] ;
782
- var reactions = dep . reactions ;
783
- if ( reactions === null ) {
784
- dep . reactions = [ derived ] ;
785
- } else if ( ! reactions . includes ( derived ) ) {
786
- reactions . push ( derived ) ;
787
- }
788
- }
789
- }
790
-
791
- derived . f ^= DISCONNECTED ;
792
- }
793
783
}
794
784
795
785
return signal . v ;
Original file line number Diff line number Diff line change @@ -550,6 +550,40 @@ describe('signals', () => {
550
550
} ;
551
551
} ) ;
552
552
553
+ test ( 'deriveds update upon reconnection #3' , ( ) => {
554
+ let a = source ( false ) ;
555
+ let b = source ( false ) ;
556
+
557
+ let c = derived ( ( ) => $ . get ( a ) || $ . get ( b ) ) ;
558
+ let d = derived ( ( ) => $ . get ( c ) ) ;
559
+ let e = derived ( ( ) => $ . get ( d ) ) ;
560
+
561
+ return ( ) => {
562
+ const log : string [ ] = [ ] ;
563
+ let destroy = effect_root ( ( ) => {
564
+ render_effect ( ( ) => {
565
+ $ . get ( e ) ;
566
+ log . push ( 'init' ) ;
567
+ } ) ;
568
+ } ) ;
569
+ destroy ( ) ;
570
+
571
+ destroy = effect_root ( ( ) => {
572
+ render_effect ( ( ) => {
573
+ $ . get ( e ) ;
574
+ log . push ( 'update' ) ;
575
+ } ) ;
576
+ } ) ;
577
+
578
+ assert . deepEqual ( log , [ 'init' , 'update' ] ) ;
579
+
580
+ set ( a , true ) ;
581
+ flushSync ( ) ;
582
+
583
+ assert . deepEqual ( log , [ 'init' , 'update' , 'update' ] ) ;
584
+ } ;
585
+ } ) ;
586
+
553
587
test ( 'unowned deriveds are not added as reactions' , ( ) => {
554
588
var count = source ( 0 ) ;
555
589
You can’t perform that action at this time.
0 commit comments