@@ -164,48 +164,20 @@ export const createViewStacks = (router: Router) => {
164
164
return [ ] ;
165
165
}
166
166
167
- /**
168
- * Given a view stack and entering/leaving views,
169
- * determine the position of each item in the stack.
170
- * This is useful for removing/adding views in between
171
- * the view items when navigating using router.go.
172
- * Use this method instead of doing an `Array.findIndex`
173
- * for both view items.
174
- */
175
- const findViewIndex = ( viewStack : ViewItem [ ] , enteringViewItem : ViewItem , leavingViewItem : ViewItem ) => {
176
- let enteringIndex = - 1 ;
177
- let leavingIndex = - 1 ;
178
-
179
- for ( let i = 0 ; i <= viewStack . length - 1 ; i ++ ) {
180
- const viewItem = viewStack [ i ] ;
181
- if ( viewItem === enteringViewItem ) {
182
- enteringIndex = i ;
183
- } else if ( viewItem === leavingViewItem ) {
184
- leavingIndex = i ;
185
- }
186
-
187
- if ( enteringIndex > - 1 && leavingIndex > - 1 ) {
188
- break ;
189
- }
190
- }
191
-
192
- return { enteringIndex, leavingIndex } ;
193
- }
194
-
195
167
/**
196
168
* When navigating backwards, we need to clean up and
197
169
* leaving pages so that they are re-created if
198
170
* we ever navigate back to them. This is especially
199
171
* important when using router.go and stepping back
200
172
* multiple pages at a time.
201
173
*/
202
- const unmountLeavingViews = ( outletId : number , enteringViewItem : ViewItem , leavingViewItem : ViewItem ) => {
174
+ const unmountLeavingViews = ( outletId : number , viewItem : ViewItem , delta : number = 1 ) => {
203
175
const viewStack = viewStacks [ outletId ] ;
204
176
if ( ! viewStack ) return ;
205
177
206
- const { enteringIndex : startIndex , leavingIndex : endIndex } = findViewIndex ( viewStack , enteringViewItem , leavingViewItem ) ;
178
+ const startIndex = viewStack . findIndex ( v => v === viewItem ) ;
207
179
208
- for ( let i = startIndex + 1 ; i < endIndex ; i ++ ) {
180
+ for ( let i = startIndex + 1 ; i < startIndex - delta ; i ++ ) {
209
181
const viewItem = viewStack [ i ] ;
210
182
viewItem . mount = false ;
211
183
viewItem . ionPageElement = undefined ;
@@ -219,14 +191,26 @@ export const createViewStacks = (router: Router) => {
219
191
* developers to step forward over multiple views.
220
192
* The intermediary views need to be remounted so that
221
193
* swipe to go back works properly.
194
+ * We need to account for the delta value here too because
195
+ * we do not want to remount an unrelated view.
196
+ * Example:
197
+ * /home --> /page2 --> router.back() --> /page3
198
+ * Going to /page3 would remount /page2 since we do
199
+ * not prune /page2 from the stack. However, /page2
200
+ * needs to remain in the stack.
201
+ * Example:
202
+ * /home --> /page2 --> /page3 --> router.go(-2) --> router.go(2)
203
+ * We would end up on /page3, but users need to be able to swipe
204
+ * to go back to /page2 and /home, so we need both pages mounted
205
+ * in the DOM.
222
206
*/
223
- const mountIntermediaryViews = ( outletId : number , enteringViewItem : ViewItem , leavingViewItem : ViewItem ) => {
207
+ const mountIntermediaryViews = ( outletId : number , viewItem : ViewItem , delta : number = 1 ) => {
224
208
const viewStack = viewStacks [ outletId ] ;
225
209
if ( ! viewStack ) return ;
226
210
227
- const { enteringIndex : endIndex , leavingIndex : startIndex } = findViewIndex ( viewStack , enteringViewItem , leavingViewItem ) ;
211
+ const startIndex = viewStack . findIndex ( v => v === viewItem ) ;
228
212
229
- for ( let i = startIndex + 1 ; i < endIndex ; i ++ ) {
213
+ for ( let i = startIndex + 1 ; i < startIndex + delta ; i ++ ) {
230
214
viewStack [ i ] . mount = true ;
231
215
}
232
216
}
0 commit comments