@@ -127,6 +127,9 @@ class Scope {
127
127
128
128
Scope _parentScope;
129
129
130
+ _FunctionChain _domReadHead, _domReadTail;
131
+ _FunctionChain _domWriteHead, _domWriteTail;
132
+
130
133
Scope get parentScope => _parentScope;
131
134
132
135
final ScopeStats _stats;
@@ -413,6 +416,72 @@ class Scope {
413
416
}
414
417
return counts;
415
418
}
419
+
420
+ /**
421
+ * Internal. Use [View.domWrite] instead.
422
+ */
423
+ void domWrite (fn ()) {
424
+ var chain = new _FunctionChain (fn);
425
+ if (_domWriteHead == null ) {
426
+ _domWriteHead = _domWriteTail = chain;
427
+ } else {
428
+ _domWriteTail = _domWriteTail._next = chain;
429
+ }
430
+ rootScope._domWriteCounter ++ ;
431
+ }
432
+
433
+ /**
434
+ * Internal. Use [View.domRead] instead.
435
+ */
436
+ void domRead (fn ()) {
437
+ var chain = new _FunctionChain (fn);
438
+ if (_domReadHead == null ) {
439
+ _domReadHead = _domReadTail = chain;
440
+ } else {
441
+ _domReadTail = _domReadTail._next = chain;
442
+ }
443
+ rootScope._domReadCounter ++ ;
444
+ }
445
+
446
+ void _runDomWrites () {
447
+ Scope child = _childHead;
448
+ while (child != null ) {
449
+ child._runDomWrites ();
450
+ child = child._next;
451
+ }
452
+
453
+ while (_domWriteHead != null ) {
454
+ try {
455
+ _domWriteHead.fn ();
456
+ } catch (e, s) {
457
+ _exceptionHandler (e, s);
458
+ }
459
+ rootScope._domWriteCounter -- ;
460
+ _domWriteHead = _domWriteHead._next;
461
+ }
462
+ _domWriteTail = null ;
463
+ }
464
+
465
+ void _runDomReads () {
466
+ Scope child = _childHead;
467
+ while (child != null ) {
468
+ child._runDomReads ();
469
+ child = child._next;
470
+ }
471
+
472
+ while (_domReadHead != null ) {
473
+ try {
474
+ _domReadHead.fn ();
475
+ } catch (e, s) {
476
+ _exceptionHandler (e, s);
477
+ }
478
+ rootScope._domReadCounter -- ;
479
+ _domReadHead = _domReadHead._next;
480
+ }
481
+ }
482
+
483
+
484
+ ExceptionHandler get _exceptionHandler => rootScope._exceptionHandler;
416
485
}
417
486
418
487
_mapEqual (Map a, Map b) => a.length == b.length &&
@@ -587,10 +656,10 @@ class RootScope extends Scope {
587
656
final Map <String , AST > astCache = new HashMap <String , AST >();
588
657
589
658
_FunctionChain _runAsyncHead, _runAsyncTail;
590
- _FunctionChain _domWriteHead, _domWriteTail;
591
- _FunctionChain _domReadHead, _domReadTail;
592
659
593
660
final ScopeStats _scopeStats;
661
+ int _domWriteCounter = 0 ;
662
+ int _domReadCounter = 0 ;
594
663
595
664
String _state;
596
665
@@ -734,37 +803,25 @@ class RootScope extends Scope {
734
803
bool runObservers = true ;
735
804
try {
736
805
do {
737
- if (_domWriteHead != null ) _stats.domWriteStart ();
738
- while (_domWriteHead != null ) {
739
- try {
740
- _domWriteHead.fn ();
741
- } catch (e, s) {
742
- _exceptionHandler (e, s);
743
- }
744
- _domWriteHead = _domWriteHead._next;
745
- if (_domWriteHead == null ) _stats.domWriteEnd ();
806
+ if (_domWriteCounter > 0 ) {
807
+ _stats.domWriteStart ();
808
+ _runDomWrites ();
809
+ _stats.domWriteEnd ();
746
810
}
747
- _domWriteTail = null ;
748
811
if (runObservers) {
749
812
runObservers = false ;
750
813
readOnlyGroup.detectChanges (exceptionHandler: _exceptionHandler,
751
814
fieldStopwatch: _scopeStats.fieldStopwatch,
752
815
evalStopwatch: _scopeStats.evalStopwatch,
753
816
processStopwatch: _scopeStats.processStopwatch);
754
817
}
755
- if (_domReadHead != null ) _stats.domReadStart ();
756
- while (_domReadHead != null ) {
757
- try {
758
- _domReadHead.fn ();
759
- } catch (e, s) {
760
- _exceptionHandler (e, s);
761
- }
762
- _domReadHead = _domReadHead._next;
763
- if (_domReadHead == null ) _stats.domReadEnd ();
818
+ if (_domReadCounter > 0 ) {
819
+ _stats.domReadStart ();
820
+ _runDomReads ();
821
+ _stats.domReadEnd ();
764
822
}
765
- _domReadTail = null ;
766
823
_runAsyncFns ();
767
- } while (_domWriteHead != null || _domReadHead != null || _runAsyncHead != null );
824
+ } while (_domWriteCounter > 0 || _domReadCounter > 0 || _runAsyncHead != null );
768
825
_stats.flushEnd ();
769
826
assert ((() {
770
827
_stats.flushAssertStart ();
@@ -822,24 +879,6 @@ class RootScope extends Scope {
822
879
return count;
823
880
}
824
881
825
- void domWrite (fn ()) {
826
- var chain = new _FunctionChain (fn);
827
- if (_domWriteHead == null ) {
828
- _domWriteHead = _domWriteTail = chain;
829
- } else {
830
- _domWriteTail = _domWriteTail._next = chain;
831
- }
832
- }
833
-
834
- void domRead (fn ()) {
835
- var chain = new _FunctionChain (fn);
836
- if (_domReadHead == null ) {
837
- _domReadHead = _domReadTail = chain;
838
- } else {
839
- _domReadTail = _domReadTail._next = chain;
840
- }
841
- }
842
-
843
882
void destroy () {}
844
883
845
884
void _transitionState (String from, String to) {
0 commit comments