Apache Cordova后退按钮事件未在Windows Phone上触发(通用)

时间:2015-06-13 10:01:29

标签: angularjs cordova windows-phone winjs win-universal-app

我已经为一个单页应用程序爬了一个Apache Cordova项目。在开始页面上有一个项目列表。当我点击某个项目时,我会使用

导航到详细信息页面
var result = {};
tokens.reverse().forEach(function(key){
    if (Object.keys(result).length==0){
        result[key] = obj[Object.keys(obj)[0]]; // inner-most key-value
    }
    else{
        var temp = {};
        temp[key] = result;
        result = temp;
    }
});

Angular.js显示详细信息模板,但是当我在Windows手机上使用硬件后退按钮时,它会暂停应用程序而不是导航回来。所以我试图连接到后退按钮事件

window.navigate("#/details/" + id); 

但是当我点击后退按钮时,这个事件甚至都没有被触发。我也使用WinJS并尝试了WinJS.Application.onbackclick,但即使这样也不行。

那么如何处理Windows Phone上的后退按钮呢?

3 个答案:

答案 0 :(得分:2)

这看起来像Cordova的Windows Phone Runtime目标中的一个错误。在Silverlight中,CordovaPage.xaml.cs文件挂接Windows Phone BackButton事件处理并将其转发到Cordova的backButton事件。

这不会在运行时版本中发生,因此您必须通过处理WinJS的onbackclick事件或Windows.Phone.UI.Input.HardwareButtons.BackPressed事件来添加您自己的平台特定处理。

答案 1 :(得分:2)

这对我有用......

function onBackPressed(eventArgs) {
   eventArgs.handled = true;
   /* Your behaviour/navigation */
}

Windows.Phone.UI.Input.HardwareButtons.addEventListener("backpressed", onBackPressed);

防止默认行为(例如暂停应用):

  

eventArgs.handled = true

更多信息:HardwareButtons.BackPressed

答案 2 :(得分:1)

Windows Phone WinJS onbackclick需要返回true或false,具体取决于您是否要退出应用程序(当您一直导航并最终想要退出时)。

//for not Windows Phone users
document.addEventListener("backbutton", function () { goBack(); }, false);
//for Windows Phone users
if (Windows && WinJS){
    WinJS.Application.onbackclick = function (event) { 
        event.handled = true;
        return goBack(); 
    };
}

goBack函数在执行时返回true,在无法再返回时返回false。

var backstack = 0;
function goForward(){
    backstack++;
    //additional navigation code
};
function goBack(){
    //show hide back arrow
    if (Windows && WinJS) {
        var currentview = Windows.UI.Core.SystemNavigationManager.getForCurrentView();
        currentview.appViewBackButtonVisibility = backstack < 1;
    }
    if(backstack > 1) {
        backstack--;
        //additional back navigation code
        return true;
    }
    else return false;
};