mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Merge pull request #134 from NativeScript/feature/cuteness-tab-fix
Fix tabs when pageCache is enabled
This commit is contained in:
@@ -408,62 +408,89 @@ export function testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelected
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack() {
|
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_NoPageCaching() {
|
||||||
|
testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(false);
|
||||||
|
}
|
||||||
|
export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_WithPageCaching() {
|
||||||
|
testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(enablePageCache: boolean) {
|
||||||
var i: number;
|
var i: number;
|
||||||
var itemCount = 3;
|
var itemCount = 3;
|
||||||
var loadedItems = [0, 0, 0];
|
var loadedItems = [0, 0, 0];
|
||||||
var unloadedItems = [0, 0, 0];
|
var unloadedItems = [0, 0, 0];
|
||||||
|
|
||||||
var tabView = _createTabView();
|
var topFrame = frameModule.topmost();
|
||||||
var items = _createItems(itemCount);
|
var oldChache;
|
||||||
tabView.items = items;
|
|
||||||
|
|
||||||
function createLoadedFor(itemIndex: number) {
|
if (topFrame.android) {
|
||||||
return function () {
|
oldChache = topFrame.android.cachePagesOnNavigate;
|
||||||
loadedItems[itemIndex] = loadedItems[itemIndex] + 1;
|
topFrame.android.cachePagesOnNavigate = enablePageCache;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createUnloadedFor(itemIndex: number) {
|
try {
|
||||||
return function () {
|
var tabView = _createTabView();
|
||||||
unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1;
|
var items = _createItems(itemCount);
|
||||||
}
|
tabView.items = items;
|
||||||
}
|
|
||||||
|
|
||||||
helper.buildUIAndRunTest(tabView, function () {
|
function createLoadedFor(itemIndex: number) {
|
||||||
try {
|
return function () {
|
||||||
// Attach to loaded/unloaded events
|
loadedItems[itemIndex] = loadedItems[itemIndex] + 1;
|
||||||
for (i = 0; i < itemCount; i++) {
|
|
||||||
items[i].view.on("loaded", createLoadedFor(i));
|
|
||||||
items[i].view.on("unloaded", createUnloadedFor(i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var detailsPageFactory = function (): pageModule.Page {
|
|
||||||
var detailsPage = new pageModule.Page();
|
|
||||||
detailsPage.content = new labelModule.Label();
|
|
||||||
return detailsPage;
|
|
||||||
};
|
|
||||||
|
|
||||||
helper.navigate(detailsPageFactory);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
// Go back to the test page.
|
|
||||||
helper.goBack();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//console.log("loaded items: " + loadedItems.join(", "));
|
function createUnloadedFor(itemIndex: number) {
|
||||||
//console.log("unloadedItems items: " + unloadedItems.join(", "));
|
return function () {
|
||||||
|
unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1;
|
||||||
// Check that at least the first item is loaded and unloaded
|
}
|
||||||
TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item");
|
|
||||||
TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item");
|
|
||||||
|
|
||||||
// Check that loaded/unloaded coutns are equal for all tabs
|
|
||||||
for (i = 0; i < itemCount; i++) {
|
|
||||||
TKUnit.assert(loadedItems[i] === unloadedItems[i],
|
|
||||||
"Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
helper.buildUIAndRunTest(tabView, function () {
|
||||||
|
try {
|
||||||
|
TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC);
|
||||||
|
|
||||||
|
// Attach to loaded/unloaded events
|
||||||
|
for (i = 0; i < itemCount; i++) {
|
||||||
|
items[i].view.on("loaded", createLoadedFor(i));
|
||||||
|
items[i].view.on("unloaded", createUnloadedFor(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
var detailsPageFactory = function (): pageModule.Page {
|
||||||
|
var detailsPage = new pageModule.Page();
|
||||||
|
detailsPage.content = new labelModule.Label();
|
||||||
|
return detailsPage;
|
||||||
|
};
|
||||||
|
|
||||||
|
helper.navigate(detailsPageFactory);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
// Go back to the test page.
|
||||||
|
helper.goBack();
|
||||||
|
}
|
||||||
|
TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC);
|
||||||
|
|
||||||
|
//console.log("loaded items: " + loadedItems.join(", "));
|
||||||
|
//console.log("unloadedItems items: " + unloadedItems.join(", "));
|
||||||
|
|
||||||
|
// Check that at least the first item is loaded and unloaded
|
||||||
|
TKUnit.assert(items[0].view.isLoaded, "Thecontent of the first tab should be loaded.");
|
||||||
|
TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item");
|
||||||
|
TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item");
|
||||||
|
|
||||||
|
// Check that loaded/unloaded coutns are equal for all tabs
|
||||||
|
for (i = 0; i < itemCount; i++) {
|
||||||
|
TKUnit.assert(loadedItems[i] === unloadedItems[i],
|
||||||
|
"Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
// Return original page cache value
|
||||||
|
if (topFrame.android) {
|
||||||
|
topFrame.android.cachePagesOnNavigate = oldChache;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _clickTheFirstButtonInTheListViewNatively(tabView: tabViewModule.TabView) {
|
function _clickTheFirstButtonInTheListViewNatively(tabView: tabViewModule.TabView) {
|
||||||
|
|||||||
@@ -273,6 +273,11 @@ export class TabView extends common.TabView {
|
|||||||
|
|
||||||
// If we are loading a TabView inside a hidden fragment this check will prevent it from polluting the action bar.
|
// If we are loading a TabView inside a hidden fragment this check will prevent it from polluting the action bar.
|
||||||
if (this.android && this.android.isShown()) {
|
if (this.android && this.android.isShown()) {
|
||||||
|
// Cover the case when pageCacheOnNavigate is enabled - set adapter in loaded as the TabView is already
|
||||||
|
// attached and _onItemsPropertyChangedSetNativeValue will not be called
|
||||||
|
if (!this._pagerAdapter && this.items) {
|
||||||
|
this._setAdapter(this.items);
|
||||||
|
}
|
||||||
this._addTabsIfNeeded();
|
this._addTabsIfNeeded();
|
||||||
this._setNativeSelectedIndex(this.selectedIndex);
|
this._setNativeSelectedIndex(this.selectedIndex);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user