3

PhoneGap と AngularJS を使って、オンラインでもオフラインでも使えるアプリを作ってみました (Android 端末用)。
デバイスがオフラインの場合はローカル データベースからユーザーのリストを取得し、デバイスがオンラインの場合は $http を使用して Web サービスからユーザーのリストを取得したいと考えています。ただし、デバイスがオンラインの場合は機能せず、Web サービスは呼び出されません。

問題は PhoneGap 非同期メソッドだと思います。実際、オフライン モードでは動作しますが、ビューを更新するには $scope.$apply を使用する必要があります。しかし、それは $http では機能しません...

誰かが非同期メソッドで $http を使用する方法を知っていますか?

function ListCtrl ($scope, $http){
    $scope.list = [];
    $scope.Id = 2;

    $scope.init = function(){
        document.addEventListener("deviceready", getList, false);
    }

    $scope.getAll = function(){ 

        $http({
            url: 'http://10.0.0.2:63414/myWebMethod/' + $scope.Id,
            method: 'GET',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
           }
        }).success(function(data) {
            $scope.list = data; 
        });
    }

    function getList(){
        var db = window.openDatabase("Database", "1.0", "list", 200000);
        var network = navigator.connection.type;
        if (network == "none"){
            // local database transaction works fine
        } else {
            $scope.getAll();
        }
        $scope.$apply();
    }

    $scope.init();
}
4

1 に答える 1

1

成功のコールバックでは、$scope.$apply(); でダイジェストをトリガーする必要もあります。

$http({
        url: 'http://10.0.0.2:63414/myWebMethod/' + $scope.Id,
        method: 'GET',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
       }
    }).success(function(data) {
        $scope.list = data; 
        $scope.$apply();
    });

$http リクエストは非同期であるため、リクエストから応答を受け取る前にプログラムが実行され続け、if (network == "none") ステートメントの後に $scope.$apply() を追加すると、何も実行されません (次のことができます)。それを除く)。

コールバックで $scope.$apply() を使用しているため、PhoneGap クエリは機能しており、$http 成功コールバックでも同じことを行う必要があります。

于 2013-04-19T18:21:46.293 に答える