fix(upgrade): correctly run change detection when `propagateDigest` is false
This commit is contained in:
parent
546eb7d851
commit
617b3d2ba5
|
@ -151,7 +151,7 @@ export class DowngradeComponentAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attach the view so that it will be dirty-checked.
|
// Attach the view so that it will be dirty-checked.
|
||||||
if (needsNgZone) {
|
if (needsNgZone || !propagateDigest) {
|
||||||
const appRef = this.parentInjector.get<ApplicationRef>(ApplicationRef);
|
const appRef = this.parentInjector.get<ApplicationRef>(ApplicationRef);
|
||||||
appRef.attachView(this.componentRef.hostView);
|
appRef.attachView(this.componentRef.hostView);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {ChangeDetectorRef, Compiler, Component, ComponentFactoryResolver, EventEmitter, Injector, Input, NgModule, NgModuleRef, OnChanges, OnDestroy, SimpleChanges, destroyPlatform} from '@angular/core';
|
import {ChangeDetectorRef, Compiler, Component, ComponentFactoryResolver, EventEmitter, Injector, Input, NgModule, NgModuleRef, OnChanges, OnDestroy, SimpleChanges, destroyPlatform} from '@angular/core';
|
||||||
import {async} from '@angular/core/testing';
|
import {async, fakeAsync, tick} from '@angular/core/testing';
|
||||||
import {BrowserModule} from '@angular/platform-browser';
|
import {BrowserModule} from '@angular/platform-browser';
|
||||||
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
|
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
|
||||||
import * as angular from '@angular/upgrade/src/common/angular1';
|
import * as angular from '@angular/upgrade/src/common/angular1';
|
||||||
|
@ -274,6 +274,42 @@ export function main() {
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it('should still run normal Angular change-detection regardless of `propagateDigest`',
|
||||||
|
fakeAsync(() => {
|
||||||
|
let ng2Component: Ng2Component;
|
||||||
|
|
||||||
|
@Component({selector: 'ng2', template: '{{ value }}'})
|
||||||
|
class Ng2Component {
|
||||||
|
value = 'foo';
|
||||||
|
constructor() { setTimeout(() => this.value = 'bar', 1000); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [BrowserModule, UpgradeModule],
|
||||||
|
declarations: [Ng2Component],
|
||||||
|
entryComponents: [Ng2Component]
|
||||||
|
})
|
||||||
|
class Ng2Module {
|
||||||
|
ngDoBootstrap() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ng1Module =
|
||||||
|
angular.module('ng1', [])
|
||||||
|
.directive(
|
||||||
|
'ng2A', downgradeComponent({component: Ng2Component, propagateDigest: true}))
|
||||||
|
.directive(
|
||||||
|
'ng2B', downgradeComponent({component: Ng2Component, propagateDigest: false}));
|
||||||
|
|
||||||
|
const element = html('<ng2-a></ng2-a> | <ng2-b></ng2-b>');
|
||||||
|
|
||||||
|
bootstrap(platformBrowserDynamic(), Ng2Module, element, ng1Module).then(upgrade => {
|
||||||
|
expect(element.textContent).toBe('foo | foo');
|
||||||
|
|
||||||
|
tick(1000);
|
||||||
|
expect(element.textContent).toBe('bar | bar');
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
it('should initialize inputs in time for `ngOnChanges`', async(() => {
|
it('should initialize inputs in time for `ngOnChanges`', async(() => {
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ng2',
|
selector: 'ng2',
|
||||||
|
|
Loading…
Reference in New Issue