Nativescript WebView,防止在Android上导航时重新加载

问题描述:

因此,我设置了一个页面,并且希望使用应用程序与网页进行交互。Nativescript WebView,防止在Android上导航时重新加载

我能够通过侦听某些URL从页面获取数据,并阻止该页面从Web浏览它们。

当我得到这些数据时,我导航到一个带有处理列表的新页面。

然后,当我点击返回按钮返回浏览器页面时,浏览器重新加载,即使其URL已设置。

很简单的设置:

XML:

<Page loaded="loaded" class="page"> 
    <Page.actionBar> 
     <ActionBar title="Cost" icon="" class="action-bar"> 
     </ActionBar> 
    </Page.actionBar> 
    <WebView id="mywebview" /> 
</Page> 

JS:

var checkPageLoad = function(event) { 
    console.log(event.url); 
    if (event.url.indexOf("mydomain") < 0) { 
    if (app.ios) { 
     event.object.ios.stopLoading(); 
    } else if (app.android) { 
     event.object.android.stopLoading(); 
    } 
    } 
    if (event.url.indexOf('custom://mydomain.com') === 0) { 

    farm(event.url.replace("custom://mydomain.com", "")); 

    } 
}; 
exports.loaded = function(args) { 
    page = args.object; 
    var web = page.getViewById("mywebview"); 
    web.on(webView.WebView.loadStartedEvent, checkPageLoad); 
    if(web.android) { // in IOS android will be undefined 
    web.android.setInitialScale(1); 
    web.android.getSettings().setLoadWithOverviewMode(true); 
    web.android.getSettings().setUseWideViewPort(true); 
    } 
    if (web.src != "http://myurl.com") { 
    web.src = "http://myurl.com"; 
    } 
}; 
function farm(item) { 

    var navigationOptions={ 
    moduleName:'./list/list', 
    context:{info: item}, 
    animated: true, 
    transition: { 
     name: "slide", 
     duration: 380, 
     curve: "easeInOut" 
    } 
    }; 
    var topmost = frameModule.topmost(); 

    topmost.navigate(navigationOptions); 
} 

所以,当我按下从 “列表” 页面后退按钮,web视图是虽然白重载。

任何想法?它是否与frameModule导航有关?

============================================== ==

更新17年6月29日:

我实现了一个变通针对此问题。它不是最好的,但它使它工作令人满意。

解决方法:使用NativeScripts pageshowModal()函数。 http://docs.nativescript.org/core-concepts/navigation#modal-pages

这会创建一个弹出窗口,当按下后退时,它将关闭弹出窗口而不重新加载webview。

为了实施,我不得不改变我的页面设置方式。

只有一个模式页面可以一次打开,因此每个视图都需要与webview页面进行通信。

页面还有一个事件onShownModally,它使框架模块的上下文略有不同。

您必须存储您发送到模态页面的回调,并在模态页面关闭时调用它。

尽管如此,仍然想用一种方式使用框架模块设置。

+0

你已经找到了一个解决方案? –

+0

不,只是我周围的工作更新了帖子。 –

+0

您可能想阅读:https://github.com/NativeScript/NativeScript/issues/4615#issuecomment-320937348:D –

This was a bug in NativeScript's tns-core-modules

直到修复将在一个公开发行(大概在3.2?),你可以使用的tns-core-modules的@next版本是这样的:

tns plugin remove tns-core-modules 
npm i [email protected] --save 

后退按钮使中转最后视图从状态onResume然后running状态。如果您有权访问onResume事件,则可以覆盖它或对其进行处理,以便在按下后退时不会发生此重新加载。例如,你可以有一个布尔值,例如isLoadFinished(您可以在加载页面完成后将其设置为true),并在onStartonResume事件被触发时检查它,以防止调用webview.load如果isLoadFinishedtrue

我不是nativeScript开发人员,所以我提出了解决方案的概念。我在nativeScript的Android应用生命周期事件中发现了this guide,我想它可能会对您有所帮助。

+0

嗯,我把所有的听众放在一起,唯一被触发的是'activityBackPressed'。我会仔细研究,看看我可以访问哪些其他活动。 –