Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 成功回调ID中出错。。。引用错误:Can';找不到变量:$http_Angularjs_Http_Oauth_Inappbrowser_Ionic - Fatal编程技术网

Angularjs 成功回调ID中出错。。。引用错误:Can';找不到变量:$http

Angularjs 成功回调ID中出错。。。引用错误:Can';找不到变量:$http,angularjs,http,oauth,inappbrowser,ionic,Angularjs,Http,Oauth,Inappbrowser,Ionic,我正在尝试用ionic(angular)构建一个混合移动应用程序。对于这个应用程序,我正在进行一个oAuth调用,该调用依赖于jQuery,因此加载了两个库以及oAuth和my and my应用程序的脚本 <script src="lib/ionic/js/ionic.bundle.js"></script> <script src="cordova.js"></script> <script src="js/jquery-1.11.1.mi

我正在尝试用ionic(angular)构建一个混合移动应用程序。对于这个应用程序,我正在进行一个oAuth调用,该调用依赖于jQuery,因此加载了两个库以及oAuth和my and my应用程序的脚本

<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>
oAuthProcess函数位于auth.js文件中,如下所示。它打开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-01-09 16:48:04.299 myApp[2146:483400]成功回调时出错ID:InAppBrowser85303841:ReferenceError:找不到变量:$http

我们将非常感谢您为解决此问题提供的任何帮助或其他方法


提前谢谢。

我将在这里键入它,以便向您展示代码示例,而不是注释

假设您给出的示例是整个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();
}

$http
不是在全局对象上公开的内容。您需要使用依赖项注入来访问它。如果您是在全局环境中执行此操作,您需要从
$injector
@PSL访问
$http
,感谢您的快速响应。请你再解释一下,我该怎么做?我对angular非常陌生,如果您已经加载angular,您可以通过执行
var$http=angular.injector(['ng']).get('$http')
来获取http实例。另外,我也不明白从匿名事件处理程序返回承诺有什么意义。@PSL我继承了auth.js代码,但在js中没有足够的进步来重新编写或创建它。如何最好地实现这一点?将这一行代码添加到auth.js文件的第一行
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();
}