Загрузка библиотеки конечных точек Google Cloud из AngularJS-Client не работает

У меня есть рабочая конечная точка, успешно протестированная с локальным API-Explorer и на AppEngine. Теперь я пытаюсь разработать AngularJS-Client. Я прочитал много материала на прошлой неделе, но это не работает. Мой контроллер выглядит так.

 'use strict';

const WEB_CLIENT_ID = "<...>.apps.googleusercontent.com";
const EMAIL_SCOPE = "https://www.googleapis.com/auth/userinfo.email";


function init() {
    window.init();
}


angular.module('stakeholder1', [])
.controller('StakeholderController', ['$scope', '$window',
  function StakeholderController($scope, $window) {

    $window.init= function() {
        $scope.$apply($scope.load_oauth_lib);
        $scope.$apply($scope.load_stakeholder_lib)
    };

    $scope.load_oauth_lib = function() {
        gapi.client.load('oauth2', 'v2', null);
        gapi.auth.authorize({client_id: WEB_CLIENT_ID,
            scope: EMAIL_SCOPE, immediate: false},
            null);
    };

    $scope.is_backend_ready = false;

    $scope.load_stakeholder_lib = function() {
        gapi.client.load('stakeholderendpoint', 'v1',
            function(){
            $scope.is_backend_ready = true;
            }, 'https://my-stakeholders.appspot.com/_ah/api');
    };

    $scope.saveStakeholder= function() {
        stakeholder = {
                    "name" : $scope.name        
            };

        gapi.

client.stakeholderendpoint.saveStakeholder(stakeholder).execute();
        }

  }]);

Моя разметка выглядит так. Если я удалю ng-show-Directive и опубликую имя, я получу ошибку «angular.js: 13236 ReferenceError: заинтересованная сторона не определена». Так что я думаю, что API не загружен.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html ng-app="stakeholder1">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>MyStakeholders</title>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
    <script src="../app/controllers/stakeholder1.js"></script>
    <script src="https://apis.google.com/js/client.js?onload=init"></script>

  </head>

  <body>
    <h1>MyStakeholders</h1>    

    <div ng-controller="StakeholderController" class="container" ng-show="is_backend_ready">    

       <form ng-submit="saveStakeholder()">
           <input type="text" ng-model="name" required><br>
           <input type="submit" class="btn" value="Post">
       </form>

    </div>

 </body>
</html>

Я использую Eclipse с GPE. В моем WEB-INF-каталоге есть сгенерированный файлtakeholderendpoint-v1.api. Должен ли этот файл загружаться с помощью gapi.client.load?

Я был бы рад некоторым подсказкам или советам, как я могу отладить процесс загрузки.


person SignorRossi    schedule 16.03.2016    source источник


Ответы (1)


Да, stakeholderendpoint должен быть загружен с gapi.client.load() в gapi, прежде чем он будет использоваться как gapi.client.stakeholderendpoint.

Этот файл в каталоге WEB-INF важен, но вы можете его игнорировать. Функция gapi.client.load() будет обрабатывать все за кулисами.

В вашем коде флаг $scope.is_backend_ready указывает, загружена ли конечная точка и готова ли она к использованию. С помощью этого флага вы можете защитить свой пользовательский интерфейс от ошибок. Но я рекомендую сохранить его в $rootScope для дальнейшего использования в других контроллерах. Или еще лучше создать сервис, который загружает все конечные точки и сохраняет состояние is_backend_ready. Затем вы можете решить показать индикатор выполнения во время загрузки конечных точек, пока is_backend_ready не станет истинным.

Или вы можете использовать библиотеку angular-gapi.

person michal-husak    schedule 05.05.2016