Skip to content

Commit 6a0c92c

Browse files
jgw96brandyscarney
authored andcommitted
fix(content): check for scroll element before modifying it (#10374)
* test(refresher): add nav based refresher e2e test * test(refresher): tweak test to repro issue * fix(content): check for scroll element * chore(content): double check for a scroll element
1 parent f47d492 commit 6a0c92c

File tree

4 files changed

+178
-3
lines changed

4 files changed

+178
-3
lines changed

src/components/content/content.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -498,9 +498,16 @@ export class Content extends Ion implements OnDestroy, OnInit {
498498
* DOM WRITE
499499
*/
500500
setScrollElementStyle(prop: string, val: any) {
501-
this._dom.write(() => {
502-
(<any>this._scrollEle.style)[prop] = val;
503-
});
501+
if (this._scrollEle) {
502+
this._dom.write(() => {
503+
// double check here as the scroll element
504+
// could have been destroyed in the 16ms it took
505+
// for this dom write to happen
506+
if (this._scrollEle) {
507+
(<any>this._scrollEle.style)[prop] = val;
508+
}
509+
});
510+
}
504511
}
505512

506513
/**
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import { Component, NgModule } from '@angular/core';
2+
import { IonicApp, IonicModule, Refresher, NavController } from '../../../../../ionic-angular';
3+
4+
5+
@Component({
6+
templateUrl: 'main.html'
7+
})
8+
export class Page1 {
9+
items: string[] = [];
10+
11+
constructor(public nav: NavController) {
12+
for (var i = 0; i < 15; i++) {
13+
this.items.push( getRandomData() );
14+
}
15+
}
16+
17+
doRefresh(refresher: Refresher) {
18+
console.info('Begin async operation');
19+
20+
getAsyncData().then((newData: string[]) => {
21+
for (var i = 0; i < newData.length; i++) {
22+
this.items.unshift( newData[i] );
23+
}
24+
25+
console.info('Finished receiving data, async operation complete');
26+
refresher.complete();
27+
});
28+
}
29+
30+
doStart(refresher: Refresher) {
31+
console.info('Refresher, start');
32+
}
33+
34+
doPulling(refresher: Refresher) {
35+
console.info('Pulling', refresher.progress);
36+
}
37+
38+
navigate() {
39+
this.nav.setRoot(Page2);
40+
}
41+
42+
}
43+
44+
function getAsyncData() {
45+
// async return mock data
46+
return new Promise(resolve => {
47+
48+
setTimeout(() => {
49+
let data: string[] = [];
50+
for (var i = 0; i < 3; i++) {
51+
data.push( getRandomData() );
52+
}
53+
54+
resolve(data);
55+
}, 3000);
56+
57+
});
58+
}
59+
60+
function getRandomData() {
61+
let i = Math.floor( Math.random() * data.length );
62+
return data[i];
63+
}
64+
65+
const data = [
66+
'Fast Times at Ridgemont High',
67+
'Peggy Sue Got Married',
68+
'Raising Arizona',
69+
'Moonstruck',
70+
'Fire Birds',
71+
'Honeymoon in Vegas',
72+
'Amos & Andrew',
73+
'It Could Happen to You',
74+
'Trapped in Paradise',
75+
'Leaving Las Vegas',
76+
'The Rock',
77+
'Con Air',
78+
'Face/Off',
79+
'City of Angels',
80+
'Gone in Sixty Seconds',
81+
'The Family Man',
82+
'Windtalkers',
83+
'Matchstick Men',
84+
'National Treasure',
85+
'Ghost Rider',
86+
'Grindhouse',
87+
'Next',
88+
'Kick-Ass',
89+
'Drive Angry'
90+
];
91+
92+
@Component({
93+
templateUrl: 'page2.html'
94+
})
95+
export class Page2 {
96+
constructor() {}
97+
}
98+
99+
@Component({
100+
template: '<ion-nav [root]="rootPage"></ion-nav>'
101+
})
102+
export class E2EApp {
103+
rootPage = Page1;
104+
}
105+
106+
@NgModule({
107+
declarations: [
108+
E2EApp,
109+
Page1,
110+
Page2
111+
],
112+
imports: [
113+
IonicModule.forRoot(E2EApp)
114+
],
115+
bootstrap: [IonicApp],
116+
entryComponents: [
117+
E2EApp,
118+
Page1,
119+
Page2
120+
]
121+
})
122+
export class AppModule {}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<ion-header>
2+
3+
<ion-toolbar>
4+
<ion-title>Pull To Refresh Navigation</ion-title>
5+
</ion-toolbar>
6+
7+
</ion-header>
8+
9+
10+
<ion-content padding>
11+
12+
<ion-refresher (ionStart)="doStart($event)" (ionPull)="doPulling($event)" (ionRefresh)="doRefresh($event)">
13+
14+
<ion-refresher-content
15+
pullingText="Pull to refresh..."
16+
refreshingSpinner="bubbles"
17+
refreshingText="Refreshing...">
18+
</ion-refresher-content>
19+
20+
</ion-refresher>
21+
22+
<h1>Pull to refresh and then navigate with the button below</h1>
23+
24+
<button ion-button (click)="navigate()">navigate</button>
25+
26+
<ion-list>
27+
<ion-item *ngFor="let item of items">
28+
{{ item }}
29+
</ion-item>
30+
</ion-list>
31+
32+
</ion-content>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<ion-header>
2+
3+
<ion-toolbar>
4+
<ion-title>Pull To Refresh Navigation</ion-title>
5+
</ion-toolbar>
6+
7+
</ion-header>
8+
9+
10+
<ion-content padding>
11+
12+
<h1>Page Two</h1>
13+
14+
</ion-content>

0 commit comments

Comments
 (0)