Skip to content

Commit b6dbe57

Browse files
author
Alexander Vakrilov
authored
fix: mark reattached view for CD (#1803)
* fix: mark reattached view for CD * chore: fix AOT build error
1 parent 596bf4c commit b6dbe57

File tree

6 files changed

+74
-8
lines changed

6 files changed

+74
-8
lines changed

Diff for: e2e/router/app/counter.service.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Injectable } from "@angular/core";
2+
import { BehaviorSubject } from "rxjs";
3+
4+
@Injectable({
5+
providedIn: "root"
6+
})
7+
export class CounterService {
8+
counter$ = new BehaviorSubject<number>(0);
9+
10+
tick() {
11+
this.counter$.next(this.counter$.value + 1);
12+
}
13+
}

Diff for: e2e/router/app/first/first.component.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { Component, OnInit, OnDestroy, OnChanges, DoCheck } from "@angular/core";
2-
import { ActivatedRoute, Router, Route } from "@angular/router";
3-
import { Location } from "@angular/common";
42
import { RouterExtensions } from "nativescript-angular/router";
5-
63
import { Page } from "tns-core-modules/ui/page";
74

5+
import { CounterService } from "../counter.service";
6+
87
@Component({
98
selector: "first",
109
template: `
@@ -21,12 +20,18 @@ import { Page } from "tns-core-modules/ui/page";
2120
<Button text="RESET" automationText="RESET" (tap)="reset()"></Button>
2221
<Label [text]="message"></Label>
2322
<Label [text]="'CHECK: ' + doCheckCount"></Label>
23+
<Label [text]="'COUNTER: ' + (service.counter$ | async)"></Label>
2424
</StackLayout>`
2525
})
2626
export class FirstComponent implements OnInit, OnDestroy, DoCheck {
2727
public message: string = "";
2828
public doCheckCount: number = 0;
29-
constructor(private routerExt: RouterExtensions, page: Page) {
29+
30+
constructor(
31+
private routerExt: RouterExtensions,
32+
public service: CounterService,
33+
page: Page) {
34+
3035
console.log("FirstComponent - constructor() page: " + page);
3136
}
3237

@@ -42,7 +47,7 @@ export class FirstComponent implements OnInit, OnDestroy, DoCheck {
4247
this.doCheckCount++;
4348
console.log("FirstComponent - ngDoCheck(): " + this.doCheckCount);
4449
}
45-
50+
4651
reset() {
4752
this.doCheckCount = 0;
4853
}

Diff for: e2e/router/app/second/second.component.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Component, OnInit, OnDestroy } from "@angular/core";
2-
import { ActivatedRoute, Router, Route } from "@angular/router";
2+
import { ActivatedRoute } from "@angular/router";
33

44
import { RouterExtensions } from "nativescript-angular/router";
55
import { Page } from "tns-core-modules/ui/page";
66
import { Observable } from "rxjs";
77
import { map } from "rxjs/operators";
8+
import { CounterService } from "../counter.service";
89

910
@Component({
1011
selector: "second",
@@ -19,6 +20,8 @@ import { map } from "rxjs/operators";
1920
<Button text="LOAD NESTED NAMED OUTLET" (tap)="loadNestedNamedOutlet()"></Button>
2021
<Button text="BACK" automationText="BACK" (tap)="goBack()"></Button>
2122
23+
<Button text="TICK" automationText="TICK" (tap)="service.tick()"></Button>
24+
2225
<GridLayout row="1" rows="*,*">
2326
<GridLayout row="0" class="nested-outlet">
2427
<router-outlet></router-outlet>
@@ -33,7 +36,11 @@ export class SecondComponent implements OnInit, OnDestroy {
3336
public depth$: Observable<string>;
3437
public nextDepth$: Observable<number>;
3538

36-
constructor(private routerExt: RouterExtensions, private route: ActivatedRoute, page: Page) {
39+
constructor(
40+
private routerExt: RouterExtensions,
41+
private route: ActivatedRoute,
42+
public service: CounterService,
43+
page: Page) {
3744
console.log("SecondComponent - constructor() page: " + page);
3845
this.depth$ = route.params.pipe(map(r => r["depth"]));
3946
this.nextDepth$ = route.params.pipe(map(r => +r["depth"] + 1));

Diff for: e2e/router/e2e/router.e2e-spec.ts

+40
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,46 @@ describe("Simple navigate and back should trigger only one CD on FirstComponent"
449449
});
450450
});
451451

452+
describe("Simple navigate and back should trigger only one CD on FirstComponent even with 3 changes in service", () => {
453+
let driver: AppiumDriver;
454+
455+
before(async () => {
456+
driver = await createDriver();
457+
await driver.resetApp();
458+
});
459+
460+
it("should find First", async () => {
461+
await assureFirstComponent(driver);
462+
});
463+
464+
it("should reset counter", async () => {
465+
await findAndClick(driver, "RESET");
466+
await driver.waitForElement("CHECK: 1");
467+
await driver.waitForElement("COUNTER: 0");
468+
});
469+
470+
it("should navigate to Second(1)/master", async () => {
471+
await findAndClick(driver, "GO TO SECOND");
472+
473+
await assureSecondComponent(driver, 1);
474+
await assureNestedMasterComponent(driver);
475+
});
476+
477+
it("should increase counter", async () => {
478+
await findAndClick(driver, "TICK");
479+
await findAndClick(driver, "TICK");
480+
await findAndClick(driver, "TICK");
481+
});
482+
483+
it("should navigate back to First", async () => {
484+
await goBack(driver);
485+
await assureFirstComponent(driver);
486+
await driver.waitForElement("CHECK: 2");
487+
await driver.waitForElement("COUNTER: 3");
488+
});
489+
});
490+
491+
452492
async function assureFirstComponent(driver: AppiumDriver) {
453493
await driver.findElementByAutomationText("FirstComponent");
454494
}

Diff for: e2e/router/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"nativescript-dev-typescript": "next",
4545
"nativescript-dev-webpack": "next",
4646
"tslib": "^1.7.1",
47-
"typescript": "^3.1.6"
47+
"typescript": "~3.1.1"
4848
},
4949
"scripts": {
5050
"e2e": "tsc -p e2e && mocha --opts ../config/mocha.opts --recursive e2e --appiumCapsLocation ../config/appium.capabilities.json",

Diff for: nativescript-angular/router/page-router-outlet.ts

+1
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ export class PageRouterOutlet implements OnDestroy { // tslint:disable-line:dire
262262
this.activated = ref;
263263

264264
// reattach to ChangeDetection
265+
this.activated.hostView.markForCheck();
265266
this.activated.hostView.reattach();
266267
this._activatedRoute = activatedRoute;
267268
this.markActivatedRoute(activatedRoute);

0 commit comments

Comments
 (0)