成功中的错误callbackId ... ReferenceError:无法找到变量:$ http

问题描述:

我正尝试构建一个带离子(角度)的混合移动应用程序。对于这个应用程序,我做了一个依赖jQuery的oAuth调用,以便加载这两个库,以及oAuth和我的以及我的应用程序的脚本。

$ionicPlatform.ready(function(){ 
    oAuthProcess.authorize({ 
    client_id: 'client', 
    client_secret: 'secret', 
    scope: 'scope', 
    redirect_uri: 'fake url' 
    }).done(function(data){ 
    localStorage.setItem('accessToken', data.access_token); 
    localStorage.setItem('refreshToken', data.refresh_token); 
    var accessToken = localStorage.getItem("accessToken"); 
    alert(accessToken); 
    }).fail(function(data){alert(data.error);}); 
}); 

的oAuthProcess功能是在auth.js文件,它看起来象下面这样:

<script src="lib/ionic/js/ionic.bundle.js"></script> 
<script src="cordova.js"></script> 
<script src="js/jquery-1.11.1.min.js"></script> 
<script src="js/auth.js"></script> 
<script src="js/app.js"></script> 

启动认证的呼叫,如下图所示,在app.js离子ready事件完成。它打开了inAppBrowser进行身份验证,然后应该关闭它的访问令牌返回给应用程序,以允许调用的API:

var oAuthProcess = { 
    authorize: function(options) { 
    var deferred = $.Deferred(); 
    var authUrl = 'some url' + $.param({ 
    client_id: options.client_id, 
    redirect_uri: options.redirect_uri, 
    response_type: 'code', 
    scope: options.scope 
    }); 
    //Open inAppBrowser with authUrl 
    var authWindow = window.open(authUrl, '_blank', 'location=no,toolbar=no'); 
    authWindow.addEventListener('loadstart', function(e) { 
    var url = '' + e.url + ''; 
    //Upon opening in     
    var code = url.match(/\?code=(.+)$/); 
    var error = url.match(/\?error=(.+)$/); 
    if (code != null || error != null) { 
     authWindow.close(); 
    } 
    if (code) { 
     $http({ 
     method: 'POST', 
     url: 'some url', 
     data: {code: code[1], client_id: options.client_id, client_secret: options.client_secret, redirect_uri: options.redirect_uri, grant_type: 'authorization_code'} 
     }).success(function(data) { 
     deferred.resolve(data); 
     }).error(function(data){ 
     deferred.reject(response.responseJSON); 
     }); 
    } else if (error) { 
     deferred.reject({ 
     error: error[1] 
     }); 
    } 
    }); 
    return deferred.promise(); 
} 

};

该应用程序能够加载inAppBrowser并创建一个令牌,但是会给出以下错误信息,它会在inAppBrowser关闭后停止令牌回到应用程序。

2015年1月9日16:48:04.299对myApp [2146:483400]在成功callbackId错误:InAppBrowser85303841:的ReferenceError:找不到变量:$ HTTP

任何帮助解决这或替代方法将非常感激。

在此先感谢。

+0

'$ http'不是在全局对象上公开的东西。您将需要使用依赖注入来访问它。如果你在全局环境中这样做,你需要从'$ injector'访问'$ http'。 – PSL 2015-01-09 23:07:51

+0

@PSL感谢您的快速响应。你能否进一步解释退出,我该怎么做?我对角度非常陌生 – Peeks 2015-01-09 23:15:04

+1

你可以通过'var $ http = angular.injector(['ng'])。get('$ http')'获得http实例,只要你有角加载。另外我不明白什么是从匿名事件处理程序返回承诺的点。 – PSL 2015-01-09 23:20:15

我只需键入它在这里,所以我可以,而不是评论表明您的代码示例...

假设你给的例子是整个auth.js文件中,添加例如PSL给你,所以该文件现在看起来像这样:

var $http = angular.injector(['ng']).get('$http'); 
var oAuthProcess = { 
    authorize: function(options) { 
    var deferred = $.Deferred(); 
    var authUrl = 'some url' + $.param({ 
    client_id: options.client_id, 
    redirect_uri: options.redirect_uri, 
    response_type: 'code', 
    scope: options.scope 
    }); 
    //Open inAppBrowser with authUrl 
    var authWindow = window.open(authUrl, '_blank', 'location=no,toolbar=no'); 
    authWindow.addEventListener('loadstart', function(e) { 
    var url = '' + e.url + ''; 
    //Upon opening in     
    var code = url.match(/\?code=(.+)$/); 
    var error = url.match(/\?error=(.+)$/); 
    if (code != null || error != null) { 
     authWindow.close(); 
    } 
    if (code) { 
     $http({ 
     method: 'POST', 
     url: 'some url', 
     data: {code: code[1], client_id: options.client_id, client_secret: options.client_secret, redirect_uri: options.redirect_uri, grant_type: 'authorization_code'} 
     }).success(function(data) { 
     deferred.resolve(data); 
     }).error(function(data){ 
     deferred.reject(response.responseJSON); 
     }); 
    } else if (error) { 
     deferred.reject({ 
     error: error[1] 
     }); 
    } 
    }); 
    return deferred.promise(); 
} 
+0

不幸的是,这并未解决问题。 – Peeks 2015-01-11 13:20:52

+0

你得到$ http未定义错误仍然? – 2015-01-12 03:28:14