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:

committed by
Kara Erickson

parent
0822dc70f2
commit
afa6b9e794
@ -596,6 +596,9 @@
|
||||
{
|
||||
"name": "getRenderer"
|
||||
},
|
||||
{
|
||||
"name": "getRendererFactory"
|
||||
},
|
||||
{
|
||||
"name": "getRootView"
|
||||
},
|
||||
|
@ -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']);
|
||||
});
|
||||
|
||||
});
|
||||
|
Reference in New Issue
Block a user