Skip to content

Commit 35c6c95

Browse files
authored
Scroll when afterRender (#239)
* Scroll when afterRender * add more documationa
1 parent 87e0979 commit 35c6c95

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,23 @@ ENV['routerScroll'] = {
110110

111111
You may want the default "out of the box" behaviour. We schedule scroll after Ember's `render`. This occurs on the tightest schedule between route transition start and end.
112112

113-
However, you have other option. You may need to delay scroll functionality until the route is idle (approximately after the first paint completes) using `scrollWhenIdle: true` in your config. `scrollWhenIdle` defaults to `false`.
113+
However, you have other options. If you need an extra tick after `render`, set `scheduleWhenAfterRender: true`. You also may need to delay scroll functionality until the route is idle (approximately after the first paint completes) using `scrollWhenIdle: true` in your config. `scrollWhenIdle` && `scheduleWhenAfterRender` defaults to `false`.
114114

115115
This config property uses [`ember-app-scheduler`](https://github.com/ember-app-scheduler/ember-app-scheduler), so be sure to follow the instructions in the README. We include the `setupRouter` and `reset`. This all happens after `routeDidChange`.
116116

117117
```javascript
118118
ENV['routerScroll'] = {
119-
scrollWhenIdle: true
119+
scrollWhenIdle: true // ember-app-scheduler
120120
};
121121
```
122122

123+
Or
124+
125+
```js
126+
ENV['routerScroll'] = {
127+
scrollWhenAfterRender: true // scheduleOnce('afterRender', ...)
128+
};
129+
123130
I would suggest trying all of them out and seeing which works best for your app!
124131

125132

addon/index.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,20 @@ class EmberRouterScroll extends EmberRouter {
100100
}
101101

102102
const scrollWhenIdle = get(this, 'service.scrollWhenIdle');
103+
const scrollWhenAfterRender = get(this, 'service.scrollWhenAfterRender');
103104

104-
if (!scrollWhenIdle) {
105+
if (!scrollWhenIdle && !scrollWhenAfterRender) {
105106
// out of the option, this happens on the tightest schedule
106107
const callback = function() {
107108
this.updateScrollPosition(transition);
108109
}
109110
scheduleOnce('render', this, callback);
111+
} else if (scrollWhenAfterRender) {
112+
// out of the option, this happens on the tightest schedule
113+
const callback = function() {
114+
this.updateScrollPosition(transition);
115+
}
116+
scheduleOnce('afterRender', this, callback);
110117
} else {
111118
// as described in ember-app-scheduler, this addon can be used to delay rendering until after the route is idle
112119
whenRouteIdle().then(() => {

addon/services/router-scroll.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class RouterScroll extends Service {
1818
preserveScrollPosition = false;
1919
// ember-app-scheduler properties
2020
scrollWhenIdle = false;
21+
scrollWhenAfterRender = false;
2122

2223
init(...args) {
2324
super.init(...args);

tests/unit/router-scroll-test.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,27 @@ module('router-scroll', function(hooks) {
134134
subject = this.owner.factoryFor('router:main').create();
135135

136136
run(() => {
137-
if(gte('3.6.0-beta.1')) {
138-
subject.trigger('routeDidChange');
139-
} else {
140-
subject.didTransition();
137+
subject.trigger('routeDidChange');
138+
});
139+
});
140+
141+
test('when the application is not FastBooted with scrollWhenAfterRender', function(assert) {
142+
assert.expect(1);
143+
const done = assert.async();
144+
145+
this.owner.register('service:fastboot', EmberObject.extend({ isFastBoot: false }));
146+
this.owner.register('service:router-scroll', EmberObject.extend({ scrollWhenAfterRender: true }));
147+
this.owner.register('router:main', EmberRouterScroll.extend({
148+
updateScrollPosition() {
149+
assert.ok(true, 'it should call updateScrollPosition.');
150+
done();
141151
}
152+
}));
153+
154+
subject = this.owner.factoryFor('router:main').create();
155+
156+
run(() => {
157+
subject.trigger('routeDidChange');
142158
});
143159
});
144160

0 commit comments

Comments
 (0)