3

我在 Angular 服务中有一个 ajax 函数,它根据后端服务检查用户的凭据。我已经大大简化了通话。当我使用 $http 服务发出 AJAX 请求时,promise API 可以正常工作:

function isOnline(){
    return $http.get(constants.dataUrl)
           .success(function(){return})
           .error(function(){return;});
}
function checkCredentials(){
    var online = isOnline();
    var checkCreds = online.then(function(){
        alert("Get succeeded");
    },
    function(response){
        alert("Get did not succeed");
    });
    return checkCreds;
}  

我看到 then 中定义的函数被调用。但是,当我使用 jQuery ajax 方法时,resolve 和 defer 方法似乎不会传播并触发 online.then 中的正确方法。下面的代码不起作用:

function isOnline(){
    var defer = $q.defer();

    $.ajax({
      url: constants.dataUrl,
      dataType: 'json',
      beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', basicAuthenticationToken());
      },
      error: function (xhr, ajaxOptions, thrownError) {
        alert("I am not online");
        defer.reject("I am not online");
      },
      success: function (data) {
        alert("I am online");
        defer.resolve(data);
      }
    });

    return defer.promise;
}
function checkCredentials(){
    var online = isOnline();
    var checkCreds = online.then(function(){
        alert("Get succeeded");
    },
    function(response){
        alert("Get did not succeed");
    });
    return checkCreds;
} 

我不能将 promise API 与普通的 jQuery ajax 方法一起使用吗?我想替换这些调用的原因与似乎不适用于 Angular $http 的复杂 PhoneGap 场景有关。

4

1 回答 1

7

Angularjs 需要被通知在它之外发生的变化。由于 ajax 事件正在由 jquery 处理,因此您需要进行应用。取决于你的函数在哪里(可能是 $scope 或 $rootScope)

defer.reject("I am not online");
$scope.$apply();

....
defer.resolve(data);
$scope.$apply();

这将使角度知道重新处理自己。这是上面的文档:http ://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$apply

每当您必须在 Angular 之外编写 javascript,但需要将其连接到其中时,您都可以使用此功能。

于 2012-12-20T01:29:57.443 回答