3

我尝试使用 PhoneGap 和 AngularJS 制作一个可以在线和离线使用的应用程序(适用于 Android 设备)。
如果设备离线,我想从本地数据库获取人员列表,如果设备在线,我想使用 $http 从 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() 将一无所获(您可以去掉它)。

PhoneGap 查询正在工作,因为您在其回调中使用了 $scope.$apply(),并且您必须在 $http 成功回调中执行相同的操作。

于 2013-04-19T18:21:46.293 回答