0

angularjs 1.1.5 を使用してモバイル phonegap アプリケーションを作成しました

アプリケーションを実行すると、ログイン フォームが表示されます。ログインに成功すると、ユーザーは新しい ' /accounts/profile ' url ( ProfileCtrlコントローラー) にリダイレクトされます。

すべてのページ (' /accounts/login ' にあるログイン フォームの横) には、画面の左上に [戻る] ボタンがあります。

アプリケーション全体が " AppCtrl " コントローラー (および戻るボタンのあるトップバー) に関連付けられています。アプリの残りの部分は、それぞれに個別のコントローラーを持つng-viewディレクティブに関連付けられています。

戻るボタンは、単純に戻ることによって AppCtrl コントローラーで定義された関数です。window.history.back()

ProfileCtrlコントローラーにバインドされた「 /accounts/profilewindow.history.back()にあるプロファイルページ(ログが成功した後に表示されるページ)でを無効にする必要があります。代わりに、ユーザーをログアウトする必要があります。(ここでは、簡単にするためにログアウトの確認を省略しています)。同じことが、電話の戻るボタンを押す場合にも当てはまります。

現時点では、ProfileCtrlgoBack() .. で子スコープから関数を変更していますが、物理的な戻るボタンにどのようにバインドするのかわかりません。$scope.$parent.goBack() = logout()

4

1 に答える 1

0

物理的な戻るボタンにバインドするには、次を使用できます。

document.addEventListener("backbutton", $scope.goBack, false);

これを行うには、コントローラーで Angular $window と $location サービスを組み合わせて使用​​する必要があります。別のページで奇妙な動作が発生する可能性があるため、 $parent スコープ関数をオーバーライドしないことをお勧めします。また、iOS デバイスでアプリを終了または一時停止することは許可されていないことに注意してください。以下のサンプルコードを参照してください。

var AppCtrl = ['$scope', '$window', '$location', '$timeout', '$notification', '$rootScope', function ($scope, $window, $location, $timeout, $notification, $rootScope) {
'use strict';

// Somewhere inside AppCtrl
$scope.checkExit = function () {

    // https://stackoverflow.com/questions/14422908/iphone-does-not-recognize-phonegaps-navigator-app
    // fack!!!
    if ($location.path() == '/home' && !$scope.isIOS) {
        $notification.confirm("Exit application?", function(result) {
            if ($window.isPhoneGap && result == 1) {
                $rootScope.$broadcast('appExit');  // ga tracking
                navigator.app.exitApp();
            }
        });
        return true;
    }

    return false;
};

$scope.goBack = function (evt) {
    if (evt != null) {
        if (evt.preventDefault) {
            evt.preventDefault();
        }
    }

    if (!$scope.checkExit()) {
        $window.history.back();
    }
};

document.addEventListener("backbutton", $scope.goBack, false);

}]; // End AppCtrl 

// in some other file, I have $notification friendly factory
app.factory('$notification', ['$rootScope', '$window', function ($rootScope, $window) {
  return {
     alert: function(message) {
         if (!$window.isPhoneGap) {
             $window.alert(message);
             return;
         }

         navigator.notification.alert(message, null, '', 'OK');
     },
     confirm: function (message, callbackFn, title, buttonLabels) {
         if (buttonLabels == null) {
             buttonLabels = 'OK,Cancel';
         }

         if (!$window.isPhoneGap) {
             callbackFn($window.confirm(message) ? 1 : 2);
             return;
         }

         navigator.notification.confirm(
                 message,       // message
                 callbackFn,    // callback to invoke with index of button pressed
                 title,         // title
                 buttonLabels.split(',')   // buttonLabels
             );
     },
     prompt: function (message, callbackFn, title, defaultText, buttonLabels) {
         if (buttonLabels == null) {
             buttonLabels = 'OK,Cancel';
         }
         if (defaultText == null) {
             defaultText = '';
         }

         if (!$window.isPhoneGap) {
             var answer = $window.prompt(message, defaultText);
             callbackFn({
                 buttonIndex: (answer ? 1 : 2),
                 input1: answer
             });
             return;
         }

         navigator.notification.prompt(
            message,        // message
            callbackFn,     // callback to invoke
            title,          // title
            buttonLabels.split(','),
            defaultText
        );
     }
  };
}]);

このコード例では、window.isPhoneGap を早い段階で ondeviceready に設定しました

于 2013-08-06T18:28:06.550 に答える