Merge pull request #1357 from NativeScript/cankov/go-back-to-backstack-entry

Frame.goBack can now accept an entry to navigate back to
This commit is contained in:
Panayot Cankov
2016-01-12 17:20:24 +02:00
3 changed files with 58 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
import TKUnit = require("./TKUnit"); import TKUnit = require("./TKUnit");
import pageModule = require("ui/page"); import pageModule = require("ui/page");
import frame = require("ui/frame"); import frame = require("ui/frame");
import { Page } from "ui/page";
export var test_backstackVisible = function() { export var test_backstackVisible = function() {
var pageFactory = function(): pageModule.Page { var pageFactory = function(): pageModule.Page {
@@ -31,6 +32,46 @@ export var test_backstackVisible = function() {
TKUnit.waitUntilReady(() => { return frame.topmost().currentPage === mainTestPage; }); TKUnit.waitUntilReady(() => { return frame.topmost().currentPage === mainTestPage; });
} }
export var test_backToEntry = function() {
let page = (tag) => () => {
var p = new Page();
p["tag"] = tag;
return p;
}
let topmost = frame.topmost();
let wait = tag => TKUnit.waitUntilReady(() => topmost.currentPage["tag"] === tag, 1);
let navigate = tag => {
topmost.navigate({ create: page(tag) });
wait(tag)
}
let back = pages => {
topmost.goBack(topmost.backStack[topmost.backStack.length - pages]);
}
let currentPageMustBe = tag => {
wait(tag); // TODO: Add a timeout...
TKUnit.assert(topmost.currentPage["tag"] === tag, "Expected current page to be " + tag + " it was " + topmost.currentPage["tag"] + " instead.");
}
navigate("page1");
navigate("page2");
navigate("page3");
navigate("page4");
currentPageMustBe("page4");
back(2);
currentPageMustBe("page2");
back(1);
currentPageMustBe("page1");
navigate("page1.1");
navigate("page1.2");
currentPageMustBe("page1.2");
back(1);
currentPageMustBe("page1.1");
back(1);
currentPageMustBe("page1");
back(1);
}
// Clearing the history messes up the tests app. // Clearing the history messes up the tests app.
export var test_ClearHistory = function () { export var test_ClearHistory = function () {
var pageFactory = function(): pageModule.Page { var pageFactory = function(): pageModule.Page {

View File

@@ -152,14 +152,27 @@ export class Frame extends CustomLayoutView implements definition.Frame {
return this._backStack.length > 0; return this._backStack.length > 0;
} }
public goBack() { /**
* Navigates to the previous entry (if any) in the back stack.
* @param to The backstack entry to navigate back to.
*/
public goBack(backstackEntry?: definition.BackstackEntry) {
trace.write(this._getTraceId() + ".goBack();", trace.categories.Navigation); trace.write(this._getTraceId() + ".goBack();", trace.categories.Navigation);
if (!this.canGoBack()) { if (!this.canGoBack()) {
// TODO: Do we need to throw an error? // TODO: Do we need to throw an error?
return; return;
} }
var backstackEntry = this._backStack.pop(); if (!backstackEntry) {
backstackEntry = this._backStack.pop();
} else {
let backIndex = this._backStack.indexOf(backstackEntry);
if (backIndex < 0) {
return;
}
this._backStack.splice(backIndex);
}
var navigationContext: NavigationContext = { var navigationContext: NavigationContext = {
entry: backstackEntry, entry: backstackEntry,
isBackNavigation: true isBackNavigation: true

3
ui/frame/frame.d.ts vendored
View File

@@ -19,8 +19,9 @@ declare module "ui/frame" {
/** /**
* Navigates to the previous entry (if any) in the back stack. * Navigates to the previous entry (if any) in the back stack.
* @param to The backstack entry to navigate back to.
*/ */
goBack(); goBack(to?: BackstackEntry);
/** /**
* Checks whether the goBack operation is available. * Checks whether the goBack operation is available.