3

バックエンド サービスに対してユーザーの資格情報をチェックする角度サービスに 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;
}  

で定義された関数が呼び出されます。ただし、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();

これにより、Angular は自分自身を再処理するように通知されます。これに関するドキュメントは次のとおりです。http://docs.angularjs.org/api/ng.$ro​​otScope.Scope #$apply

この機能は、Angular の外部で JavaScript を記述する必要があるときにいつでも使用できますが、それを接続する必要があります。

于 2012-12-20T01:29:57.443 に答える