2013-06-29 57 views
0

Angular JS新手:我得到了gapi is not defined,因为在加载API之前调用了sydney.userAuthed。但我不明白为什么在创建控制器时调用方法sydney.auth。页面加载时出现错误,没有用户交互。AngularJS控制器init

calling auth api.js:22 
ReferenceError: gapi is not defined 
    at Object.sydney.userAuthed (http://localhost:8888/js/api.js:36:8) 
    at Object.sydney.auth (http://localhost:8888/js/api.js:23:30) 
    at new LoginController (http://localhost:8888/js/controllers.js:8:24) 
    at invoke (http://localhost:8888/lib/angular/angular.js:2902:28) 
    at Object.instantiate (http://localhost:8888/lib/angular/angular.js:2914:23) 
    at http://localhost:8888/lib/angular/angular.js:4805:24 
    at updateView (http://localhost:8888/lib/angular/angular-ui-router.js:931:30) 
    at <error: illegal access> 
    at Object.Scope.$broadcast (http://localhost:8888/lib/angular/angular.js:8307:28) 
    at $state.transition.resolved.then.$state.transition (http://localhost:8888/lib/angular/angular-ui-router.js:747:20) angular.js:5754 
OAuth2 API loaded api.js:13 

ui-router限定的state为:

function LoginController($scope, $state) { 
    $scope.auth = sydney.auth($state); 
} 

sydney.auth方法用于使用Google APIs Client Library for JavaScript认证用户:

myapp.config(function($stateProvider, $routeProvider) { 

    $stateProvider.state('signin', { 
     url : "/", // root route 
     views : { 
      "signinView" : { 
       templateUrl : 'partials/signin.html', 
       controller: 'LoginController' 
      } 
     }, 
    }) 

作为控制器被定义。

var sydney = sydney || {}; 

sydney.auth = function($state) { 
    console.log("calling auth"); 
    sydney.signin(false, sydney.userAuthed($state)); 
} 

sydney.signin = function(mode, callback) { 
     gapi.auth.authorize({client_id: sydney.CLIENT_ID, 
     scope: sydney.SCOPES, immediate: mode, 
     response_type: 'token id_token'}, 
     callback); 
     console.log("signin called"); 
} 

sydney.userAuthed = function($state) { 
     var request = 
      gapi.client.oauth2.userinfo.get().execute(function(resp) { 
     if (!resp.code) { 
      var token = gapi.auth.getToken(); 
      token.access_token = token.id_token; 
      gapi.auth.setToken(token); 
      // User is signed in, call my Endpoint 
      gapi.client.realestate.owner.create().execute(function(resp) { 
       alert("Signed In"); 
       $state.transitionTo("signedin"); 
      }); 
     } 
     }); 
    } 

编辑

正确的答案是定义$scope.auth作为一个函数:

function LoginController($scope, $state) { 
    $scope.auth = function() { 
     sydney.auth($state); 
    } 
} 
+0

你有一个这样的运动员吗?您可以尝试将gapi添加到函数变量,如此函数($ state,gapi) – pasine

回答

1

好像你正在试图做的就是从你的范围sydney.auth功能是什么。如果是这样,你应该改变你的LoginController到:

function LoginController($scope, $state) { 
    $scope.auth = sydney.auth; 
} 

你的代码所做的就是调用sydney.auth功能和设置$scope.auth其返回值,这不是我想你打算。

+0

接受的答案是因为它帮助我找到正确的解决方案。用正确的答案编辑问题。 – Sydney