Skip to content
This repository has been archived by the owner on Mar 5, 2018. It is now read-only.

Commit

Permalink
Updates per feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
pittst3r committed Apr 14, 2017
1 parent 492b184 commit 46acd0e
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 29 deletions.
63 changes: 38 additions & 25 deletions src/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import DynamicScope from './dynamic-scope';
import Environment from './environment';
import mainTemplate from './templates/main';

function NOOP() {}

export interface ApplicationOptions {
rootName: string;
resolver: Resolver;
Expand All @@ -50,17 +52,16 @@ export default class Application implements Owner {
private _rootsIndex: number = 0;
private _registry: Registry;
private _container: Container;
private _renderResult: RenderResult;
private _afterRender: Option<() => void>;
/** Whether a re-render has been scheduled. */
private _scheduled: Option<Promise<void>> = null;
private _initializers: Initializer[] = [];
private _initialized = false;
private _rerender: () => void = NOOP;
private _afterRender: () => void = NOOP;
private _renderPromise: Option<Promise<void>>;

constructor(options: ApplicationOptions) {
this.rootName = options.rootName;
this.resolver = options.resolver;
this._scheduled = new Promise<void>(resolve => {
this._renderPromise = new Promise<void>(resolve => {
this._afterRender = resolve;
});
}
Expand Down Expand Up @@ -138,13 +139,25 @@ export default class Application implements Owner {

this.env.commit();

let { _afterRender: afterRender } = this;
let renderResult = result.value;

this.rerender = () => {
this.env.begin();
renderResult.rerender();
this.env.commit();
this.didRender();
};

this.didRender();
}

didRender(): void {
let { _afterRender } = this;

this._afterRender = null;
this._scheduled = null;
this._renderResult = result.value;
this._afterRender = NOOP;
this._renderPromise = null;

afterRender();
_afterRender();
}

renderComponent(
Expand All @@ -156,24 +169,24 @@ export default class Application implements Owner {
return this.scheduleRerender();
}

/** @hidden */
rerender(): void {
this.env.begin();
this._renderResult.rerender();
this.env.commit();
}

/** @hidden */
scheduleRerender(): Promise<void> {
if (this._scheduled) return this._scheduled;
let { _renderPromise } = this;

return this._scheduled = new Promise<void>(resolve => {
requestAnimationFrame(() => {
this._scheduled = null;
this.rerender();
resolve();
if (_renderPromise === null) {
_renderPromise = this._renderPromise = new Promise<void>(resolve =>{
this._afterRender = resolve;
});
});

this._scheduleRerender();
}

return _renderPromise;
}

_scheduleRerender(): void {
if (this._renderPromise !== null) {
requestAnimationFrame(this._rerender);
}
}

/**
Expand Down
2 changes: 1 addition & 1 deletion test/action-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ test('can curry arguments to actions', function(assert) {
passedEvent = null;

helloWorldComponent.name = "cruel world";
app.rerender();
app.scheduleRerender();

h1 = app.rootElement.querySelector('h1');
h1.onclick(fakeEvent);
Expand Down
6 changes: 3 additions & 3 deletions test/environment-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ test('can render a component with the component helper', function(assert) {

assert.equal(app.rootElement.innerText, 'Hello Glimmer!');

app.rerender();
app.scheduleRerender();

assert.equal(app.rootElement.innerText, 'Hello Glimmer!');
});
Expand Down Expand Up @@ -95,7 +95,7 @@ test('can render a custom helper', function(assert) {

assert.equal(app.rootElement.innerText, 'Hello Glimmer!');

app.rerender();
app.scheduleRerender();

assert.equal(app.rootElement.innerText, 'Hello Glimmer!');
});
Expand All @@ -114,7 +114,7 @@ test('can render a custom helper that takes args', function(assert) {

assert.equal(app.rootElement.innerText, 'Hello Tom Dale!');

app.rerender();
app.scheduleRerender();

assert.equal(app.rootElement.innerText, 'Hello Tom Dale!');
});
Expand Down

0 comments on commit 46acd0e

Please sign in to comment.