2015-01-20 3 views
0

Итак, я пытаюсь создать мобильное приложение с использованием Durandal. Однако у меня возникли проблемы с интеграцией Google и JS API. Я думаю, вот в чем проблема: клиент javascript для gapi поставляется с асинхронной загрузкой, поэтому инициализация durandal будет сбой с неопределенностью gapi, и из-за этого компоненты css также не отображаются должным образом. Я попытался поместить следующие теги сценария в файл login.html моего представления для login.js или даже в разделе require.js моего main.js, но он все еще не работает. Сценарии для ссылки на Google Api:Durandal JS и Google Plus Войти Javascript API

<script src="https://apis.google.com/js/client:platform.js" async defer> </script> 
<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script> 

//onSignInCallBack function to call in login.js after user signs in vis Google Plus 
onSignInCallback: function(authResult) { 
        gapi.client.load('plus','v1').then(function() { 

         if (authResult['access_token']) { 
          $('#authOps').show('slow'); 
          $('#gConnect').hide(); 
          var user_access_token = authResult['access_token']; 
          var id_token = authResult['id_token']; 
         } else if (authResult['error']) { 
          // There was an error, which means the user is not signed in. 
          console.log('There was an error: ' + authResult['error']); 
          $('#authOps').hide('slow'); 
          $('#gConnect').show(); 
         } 
         console.log('authResult', authResult); 
        }); 
       }, 

Вот мой main.js файл:

requirejs.config({ 
    paths: { 
     'text': '../Scripts/text', 
     'durandal': '../Scripts/durandal', 
     'plugins': '../Scripts/durandal/plugins', 
     'transitions': '../Scripts/durandal/transitions', 
     'knockout' : '../Scripts/knockout-3.1.0', 
     'bootstrap': '../Scripts/bootstrap', 
     'jquery':'../Scripts/jquery-1.9.1', 
     'async':'../Scripts/async' 
    } 
}); 


define(['durandal/system', 
     'durandal/app', 
     'durandal/viewLocator', 
     'durandal/binder', 
     'utils/routines', 
     'async!https://apis.google.com/js/platform.js?onload=onLoadCallback', 
     'async!https://apis.google.com/js/client:platform.js' 

], function (system, app, viewLocator, binder,routines,callback,gapi) { 

    //>>excludeStart("build", true); 
    system.debug(true); 
    //>>excludeEnd("build"); 

    app.configurePlugins({ 
     router: true, 
     dialog: true, 
     widget: true 
    }); 

    app.start().then(function() { 
     //Replace 'viewmodels' in the moduleId with 'views' to locate the view. 
     //Look for partial views in a 'views' folder in the root. 
     viewLocator.useConvention(); 

     //Show the app by setting the root view model for our application with a transition. 
     app.setRoot('shell/shell', 'entrance'); 

     // override bad route behavior to write to 
     // console log and show error toast 
     /* 
     router.handleInvalidRoute = function (route, params) { 
      logger.logError('No route found', route, 'main', true); 
     }; 
     */ 
    }); 
}); 

Вот мой index.html:

<!DOCTYPE html> 
<html> 
<head> 

    <meta charset="utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" /> 
    <meta name="apple-mobile-web-app-capable" content="yes" /> 
    <meta name="apple-mobile-web-app-status-bar-style" content="black" /> 
    <meta name="format-detection" content="telephone=no" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 

    <link rel="apple-touch-startup-image" href="/Content/images/ios-startup-image- landscape.png" media="(orientation:landscape)" /> 
    <link rel="apple-touch-startup-image" href="/Content/images/ios-startup-image-portrait.png" media="(orientation:portrait)" /> 
    <link rel="apple-touch-icon" href="~/Content/images/icon.png" /> 
    <link href="/Content/ie10mobile.css" rel="stylesheet" /> 
    <link href="/Content/bootstrap.min.css" rel="stylesheet" /> 
    <link href="/Content/font-awesome.min.css" rel="stylesheet" /> 
    <link href="/Content/durandal.css" rel="stylesheet" /> 
    <link href="/Content/starterkit.css" rel="stylesheet" /> 

    <script type="text/javascript"> 

     if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 
      var msViewportStyle = document.createElement("style"); 
      var mq = "@@-ms-viewport{width:auto!important}"; 
      msViewportStyle.appendChild(document.createTextNode(mq)); 
      document.getElementsByTagName("head")[0].appendChild(msViewportStyle); 
     } 
    </script> 
</head> 
<body> 
    <div id="applicationHost"> 
     <div class="text-center"> 
      <br/><br/><br/><br/> 
      <i class="fa fa-spinner fa-spin"></i> 
      <div class="message"> 
       Loading.... 
      </div> 
     </div> 
    </div> 
    <script type="text/javascript" src="Scripts/require.js" data-main="/App/main"></script> 

</body> 
</html> 

ли кто-нибудь когда-нибудь пытались интегрировать Google плюс войти в Durandal и иметь эту же проблему? Помощь и предложение очень ценятся!

+0

Как вы знаете, теги «script» на любой странице, кроме вашей начальной страницы, игнорируются. –

+0

Да, это то, что я думал, но я не мог найти другого пути. Поэтому, если я пытаюсь загрузить API, вызывая URL-адрес, что лучший способ сделать это в Durandal? Могу ли я поместить url в раздел require.js основного, где я ссылаюсь на другие скрипты? Спасибо Эрик! –

+0

Также я использовал фреймворк sdk javascript, который загружается асинхронно, и он отлично работает, но не для google плюс javascript api. –

ответ

1

Для удаленных асинхронных нагрузок под Durandal (или, другими словами, под RequireJS) вам понадобятся асинхронный, goog и propertyParser plugins. См. Readme по этой ссылке.

В качестве примера, вот что мы делаем для Google Maps:

в свойстве дорожек RequireJS (обычно в main.js файл Дюрандал), в следующем порядке:

'async': '../Scripts/plugins/async', 
'propertyParser': '../Scripts/plugins/propertyParser', 
'goog': '../Scripts/plugins/goog' 

определить, а также в main.js файл Дюрандал, перед основной функцией, которая пинает приложение:

define('jquery', function() { return jQuery; }); 
define('knockout', ko); 
define('gmaps', ['async!http://maps.google.com/maps/api/js?sensor=false'], 
    function() {    
     return window.google.maps; 
    }); 

define(['durandal/system', 
     'durandal/app', 
     'durandal/viewLocator', 
     'bindings', 
     'extenders', 
     'validations'], 
    function (system, app, viewLocator, bindings, extenders, validations) { 

Обратите внимание на async! перед удаленным URL-адресом API. Также обратите внимание, что мы фактически не определяем gmaps для основной точки входа приложения. Мы установили глобальное определение до главной точкой входа.

Пожалуйста, дайте мне знать, если это поможет.

+0

@KendrickLay Не могли бы вы разместить свой файл main.js и index.html (или что бы ваша страница по умолчанию)? Благодарю. –

+0

@ KendrickLay O.K. Я сделал еще несколько исследований по этому вопросу. Как и в случае с API Карт Google, вам понадобятся два дополнительных плагина: плагин ** goog ** и плагин ** propertyParser **. Я думал, что они нужны только для Карт Google. Я уточню свой ответ. –

+0

@KenrickLay Посмотрите на свои 'определяет'. Я обновил свой код, чтобы показать вам, куда они будут идти, и это делает их доступными для всего мира для инъекций по всему вашему приложению. Что касается специфики используемого вами API, я не могу вам помочь. Возможно, вам придется использовать префикс 'goog!' Для используемого вами API. Кроме того, вам может потребоваться вернуть ссылку на глобальное окно, как это происходит с Картами Google. Форум для тех плагинов может быть лучшим местом для публикации вопроса. Просто, чтобы вы знали, это грязный бизнес. Но он работает надежно ... –

1

Итак, я нашел решение интегрировать знак google plus в мое приложение Durandal. Вам в основном нужно включить asyncJS (не нужно включать googJS/propertyParserJS, goog работает только для определенных API-интерфейсов Google (https://developers.google.com/loader/?csw=1#AvailableAPIs) в разделе require main.js и определяет api-клиент google в main.js. Однако, вы не можете использовать следующие адреса для вызова API в вашем определить в main.js.

<script src="https://apis.google.com/js/client:platform.js" async defer> </script> 
<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script> 

в Google Plus Вход документации Javascript API, вам будет предложено включить вышеуказанные теги сценария в HTML-файл. Однако , это не работает с requireJS и асинхронной Вместо этого вам нужно позвонить Google Client API и использовать следующий URL-адрес в main.js:.

 define('gapi',['async!https://apis.google.com/js/client.js!onload'], function() { 
     console.log('gapi loaded: ' + gapi); 
     return window.gapi; 
    }); 

После этого вы можете вызвать gapi в своей конкретной модели просмотра, включив ее в раздел определения вашей модели.Для реализации Google Plus, войдите в систему, вы можете вызвать следующую функцию после определения и передачи в параметрах, как указано в инструкции в Google Plus Вход в Javascript API (https://developers.google.com/+/web/signin/javascript-flow):

define(['gapi'], function(gapi) { 
    return { 
     additionalParams : { 
      'callback': "specify a callback function here", 
      'clientid' :"your client_ID", 
      'scope' : "scope for permissions", 
      'cookiepolicy' : "single_host_origin" 
      }, 


      googlelogin: function() { 
       gapi.auth.signIn(this.additionalParams); 
      } 
    } 
    }); 

Затем я связать googlelogin метод для моей кнопки входа в Google, используя data-bind="click:googlelogin". Это позволит вам войти в систему, используя свой Google Plus после нажатия кнопки. Однако этот метод, похоже, имеет проблему, когда речь заходит о обратном вызове для меня. Так вот вторая альтернатива, которая работает для меня, используйте следующий метод для авторизации пользователя и выполнить функцию обратного вызова (вы должны определить это), когда ваш знак в щелчке по кнопке:

gapi.auth.authorize(parameters,signinCallBack); 

указаны здесь параметры: (https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauthauthorize). Надеемся, что это поможет вам интегрировать ваше приложение Durandal/RequireJS с Google Plus и Ouath2 для реализации JS на стороне клиента! Спасибо @EricTaylor за руководство меня!

+1

любой шанс вы можете опубликовать полный скрипт main.js. Я добавил определение, но я ничего не запустил на консоль. – Luke

+0

Я пытаюсь реализовать reCaptcha, и это кажется многообещающим, но не правильным. Если вы можете опубликовать ur main Js или еще лучше, если вы сделали reCaptcha. спасибо – mboko

+0

Вы можете использовать метод gapi.auth.signIn, если вы передаете функцию обратного вызова непосредственно атрибуту callback следующим образом: 'callback': onSignIn Если вы сделаете это как в своем примере ('callback': "onSignIn"), он просто работает с глобальными функциями обратного вызова. –

Смежные вопросы