fix(ivy): execute the optional begin and end methods of the rendererFactory (#25273)

This is required to i.e. flush animations when using a Renderer2.
`rf.begin()` and `rf.end()` around the change detection.

PR Close #25273
This commit is contained in:
Victor Berchet
2018-08-02 16:53:34 -07:00
committed by Kara Erickson
parent 0822dc70f2
commit afa6b9e794
4 changed files with 62 additions and 5 deletions

View File

@ -596,6 +596,9 @@
{
"name": "getRenderer"
},
{
"name": "getRendererFactory"
},
{
"name": "getRootView"
},

View File

@ -8,11 +8,12 @@
import {withBody} from '@angular/private/testing';
import {ChangeDetectionStrategy, ChangeDetectorRef, DoCheck} from '../../src/core';
import {ChangeDetectionStrategy, ChangeDetectorRef, DoCheck, RendererType2} from '../../src/core';
import {getRenderedText, whenRendered} from '../../src/render3/component';
import {LifecycleHooksFeature, defineComponent, defineDirective, injectChangeDetectorRef} from '../../src/render3/index';
import {bind, container, containerRefreshEnd, containerRefreshStart, detectChanges, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, interpolation1, interpolation2, listener, markDirty, text, textBinding, tick} from '../../src/render3/instructions';
import {RenderFlags} from '../../src/render3/interfaces/definition';
import {RElement, Renderer3, RendererFactory3} from '../../src/render3/interfaces/renderer';
import {containerEl, createComponent, renderComponent, requestAnimationFrame} from './render_util';
@ -1043,4 +1044,40 @@ describe('change detection', () => {
});
it('should call begin and end when the renderer factory implements them', () => {
const log: string[] = [];
const testRendererFactory: RendererFactory3 = {
createRenderer: (hostElement: RElement | null, rendererType: RendererType2 | null):
Renderer3 => { return document; },
begin: () => log.push('begin'),
end: () => log.push('end'),
};
class MyComponent {
get value(): string {
log.push('detect changes');
return 'works';
}
static ngComponentDef = defineComponent({
type: MyComponent,
selectors: [['my-comp']],
factory: () => new MyComponent(),
template: (rf: RenderFlags, ctx: MyComponent) => {
if (rf & RenderFlags.Create) {
text(0);
}
if (rf & RenderFlags.Update) {
textBinding(0, bind(ctx.value));
}
}
});
}
const myComp = renderComponent(MyComponent, {rendererFactory: testRendererFactory});
expect(getRenderedText(myComp)).toEqual('works');
expect(log).toEqual(['begin', 'detect changes', 'end']);
});
});