requireJS和谷歌+;Javascript API

requireJS和谷歌+;Javascript API,javascript,requirejs,Javascript,Requirejs,我已经尝试了一段时间,我完全陷入了这个问题,希望有人能给我一些想法,我可以如何解决这个问题。 问题就在这里 我想使用谷歌Javascript API登录我的网站。 我的javascript是 define(function (require) { init = function(){ require( ['https://apis.google.com/js/platform.js?onload=renderButton'], function(gapi){

我已经尝试了一段时间,我完全陷入了这个问题,希望有人能给我一些想法,我可以如何解决这个问题。 问题就在这里

我想使用谷歌Javascript API登录我的网站。 我的javascript是

define(function (require) {
    init = function(){
        require( ['https://apis.google.com/js/platform.js?onload=renderButton'], function(gapi){
            renderButton();
        });
    },
    renderButton = function(){
        console.log("renderbutton called");
        gapi.signin2.render('google-signin', {
            'scope': 'https://www.googleapis.com/auth/plus.login',
            'width': 151,
            'height': 25,
            'longtitle': true,
            'theme': 'dark'
        });
    },
});
define(function (require) {
    "use strict";
    var $ = require('jquery'),
    ....
    ....
    .... includes other codes

    require( ['https://apis.google.com/js/platform.js'], function(){
        var renderButton;

        window.gapi.signin2.render('google-signin', {
            'scope': 'https://www.googleapis.com/auth/plus.login',
            'width': 151,
            'height': 25,
            'longtitle': true,
            'theme': 'dark',
            'onsuccess': onSuccess,
            'onfailure': onFailure
        });
    });
}
当我这样做时,它返回带有“ReferenceError:gapi未定义”的错误消息

所以我尝试了以下方法,但没有成功

define(function (require) {
    init = function(){
        require( ['https://apis.google.com/js/platform.js?onload=renderButton'], function(gapi){
            renderButton(gapi);
        });
    },
    renderButton = function(gapi){
        console.log("renderbutton called");
        gapi.signin2.render('google-signin', {
            'scope': 'https://www.googleapis.com/auth/plus.login',
            'width': 151,
            'height': 25,
            'longtitle': true,
            'theme': 'dark'
        });
    },
});

我知道我问了这个问题,但我最终还是成功了。 我不确定我的方法是否正确。 所以,如果有更好的方法,请告诉我

我的javascript是

define(function (require) {
    init = function(){
        require( ['https://apis.google.com/js/platform.js?onload=renderButton'], function(gapi){
            renderButton();
        });
    },
    renderButton = function(){
        console.log("renderbutton called");
        gapi.signin2.render('google-signin', {
            'scope': 'https://www.googleapis.com/auth/plus.login',
            'width': 151,
            'height': 25,
            'longtitle': true,
            'theme': 'dark'
        });
    },
});
define(function (require) {
    "use strict";
    var $ = require('jquery'),
    ....
    ....
    .... includes other codes

    require( ['https://apis.google.com/js/platform.js'], function(){
        var renderButton;

        window.gapi.signin2.render('google-signin', {
            'scope': 'https://www.googleapis.com/auth/plus.login',
            'width': 151,
            'height': 25,
            'longtitle': true,
            'theme': 'dark',
            'onsuccess': onSuccess,
            'onfailure': onFailure
        });
    });
}

我设置了一个requirejs配置,如下所示:

window.require = {
    "shim": {
        "gapi": {
            "exports": "gapi"
        }
    },
    "paths": {
        "gapi": "https://apis.google.com/js/platform"
    }
}
define('gapi', {
    load: function (name, req, onload, config) {
        //req has the same API as require().
        req(['gapi'], function (gapi) {
            gapi.load(name, function () {
              onload(gapi[name]);
           });
        });
    }
});
然后我可以做:

require(['gapi'], function (gapi) {
  gapi.load("", function () {
    // ..whatever..
  });
});
这是一个奇怪的图书馆。我试着做签名库,结果却需要这么做

gapi.load('auth2', function () {
  gapi.auth2.init({
    client_id: GOOGLE_SIGN_IN_CLIENT_ID
  });
  gapi.load('signin2', function () {
    gapi.signin2.render('g-signin', options);
  });
});
因此,您可能需要设置一个“谷歌登录”加载程序。基本上是这样的:

window.require = {
    "shim": {
        "gapi": {
            "exports": "gapi"
        }
    },
    "paths": {
        "gapi": "https://apis.google.com/js/platform"
    }
}
define('gapi', {
    load: function (name, req, onload, config) {
        //req has the same API as require().
        req(['gapi'], function (gapi) {
            gapi.load(name, function () {
              onload(gapi[name]);
           });
        });
    }
});
然后你可以:

require(['gapi!auth2', 'gapi!signin2'], function (auth2, signin2) {
  auth2.init({client_id: CLIENTID});
  signin2.render(...);
});

不完全确定,但我认为你只需要将gapi传递给renderButton。。例如,renderButton(gapi);。Require似乎将您的gapi模块加载到当前作用域中,但如果不作为参数传递,则无法被另一个并行函数的作用域访问。多亏了grack的抱怨。我已经试过了。我不确定你的意思。我理解你的意思,但仍然有人抱怨gapi没有定义。显然,这似乎不能正常工作(不再),因为
define('gapi')
覆盖了
shim
中的一个。因此,您实际上需要在
define()
中使用不同的名称来避免这种冲突。你能证实吗?