@@ -5,19 +5,21 @@ import {
55 RenderViewWithFragments
66} from "angular2/src/core/render/api" ;
77import { ON_WEB_WORKER } from "angular2/src/web_workers/shared/api" ;
8- import { List , ListWrapper } from "angular2/src/core/facade/collection" ;
8+ import { List , MapWrapper , ListWrapper } from "angular2/src/core/facade/collection" ;
99
1010@Injectable ( )
1111export class RenderViewWithFragmentsStore {
1212 private _nextIndex : number = 0 ;
1313 private _onWebWorker : boolean ;
1414 private _lookupByIndex : Map < number , RenderViewRef | RenderFragmentRef > ;
1515 private _lookupByView : Map < RenderViewRef | RenderFragmentRef , number > ;
16+ private _viewFragments : Map < RenderViewRef , List < RenderFragmentRef > > ;
1617
1718 constructor ( @Inject ( ON_WEB_WORKER ) onWebWorker ) {
1819 this . _onWebWorker = onWebWorker ;
1920 this . _lookupByIndex = new Map < number , RenderViewRef | RenderFragmentRef > ( ) ;
2021 this . _lookupByView = new Map < RenderViewRef | RenderFragmentRef , number > ( ) ;
22+ this . _viewFragments = new Map < RenderViewRef , List < RenderFragmentRef > > ( ) ;
2123 }
2224
2325 allocate ( fragmentCount : number ) : RenderViewWithFragments {
@@ -34,7 +36,7 @@ export class RenderViewWithFragmentsStore {
3436 return renderViewWithFragments ;
3537 }
3638
37- store ( view : RenderViewWithFragments , startIndex : number ) {
39+ store ( view : RenderViewWithFragments , startIndex : number ) : void {
3840 this . _lookupByIndex . set ( startIndex , view . viewRef ) ;
3941 this . _lookupByView . set ( view . viewRef , startIndex ) ;
4042 startIndex ++ ;
@@ -44,13 +46,21 @@ export class RenderViewWithFragmentsStore {
4446 this . _lookupByView . set ( ref , startIndex ) ;
4547 startIndex ++ ;
4648 } ) ;
49+
50+ this . _viewFragments . set ( view . viewRef , view . fragmentRefs ) ;
4751 }
4852
49- retreive ( ref : number ) : RenderViewRef | RenderFragmentRef {
50- if ( ref == null ) {
51- return null ;
52- }
53- return this . _lookupByIndex . get ( ref ) ;
53+ remove ( view : RenderViewRef ) : void {
54+ this . _removeRef ( view ) ;
55+ var fragments = this . _viewFragments . get ( view ) ;
56+ fragments . forEach ( ( fragment ) => { this . _removeRef ( fragment ) ; } ) ;
57+ MapWrapper . delete ( this . _viewFragments , view ) ;
58+ }
59+
60+ private _removeRef ( ref : RenderViewRef | RenderFragmentRef ) {
61+ var index = this . _lookupByView . get ( ref ) ;
62+ MapWrapper . delete ( this . _lookupByView , ref ) ;
63+ MapWrapper . delete ( this . _lookupByIndex , index ) ;
5464 }
5565
5666 serializeRenderViewRef ( viewRef : RenderViewRef ) : number {
@@ -66,17 +76,30 @@ export class RenderViewWithFragmentsStore {
6676 return null ;
6777 }
6878
69- return this . retreive ( ref ) ;
79+ return this . _retrieve ( ref ) ;
7080 }
7181
7282 deserializeRenderFragmentRef ( ref : number ) : RenderFragmentRef {
7383 if ( ref == null ) {
7484 return null ;
7585 }
7686
77- return this . retreive ( ref ) ;
87+ return this . _retrieve ( ref ) ;
88+ }
89+
90+ private _retrieve ( ref : number ) : RenderViewRef | RenderFragmentRef {
91+ if ( ref == null ) {
92+ return null ;
93+ }
94+
95+ if ( ! this . _lookupByIndex . has ( ref ) ) {
96+ return null ;
97+ }
98+
99+ return this . _lookupByIndex . get ( ref ) ;
78100 }
79101
102+
80103 private _serializeRenderFragmentOrViewRef ( ref : RenderViewRef | RenderFragmentRef ) : number {
81104 if ( ref == null ) {
82105 return null ;
0 commit comments