2016-11-30 8 views
1

<google-signin><google-signin-aware>のPolymerでGoogle APIを使用すると、カレンダーデータを取得してコンソールに記録できますが、別のPolymer関数(コールバックの外側)が機能しません。コールバック内でPolymer関数を呼び出すと 'TypeError .. is not a function'が返されます

私はここに示されているような答えからヒントを適用しようとした

https://stackoverflow.com/a/24716257/5779929機能に直接.bind(this)を使用してこれを渡す:

handleResponse: function (response) { 
    console.log('got response: ', response); 
    this.calendar = response; 
}, 

listUpcomingEvents: function() { 
    var queryBody = { 'showDeleted': false }; 

    var request = gapi.client.calendar.events.list(queryBody); 

    request.execute(function (resp) { 
     console.log(resp); 
     this.handleResponse(resp); 
    }.bind(this)); 
}, 

上記のスニペットでthis.handleResponseへの呼び出しが与える:

"Uncaught TypeError: this.handleResponse is not a function"

私はこのようにそれを書くことを試みた:ここに示されているよう request.execute(this.handleResponse.bind(this)); Getting access to a Polymer method inside a function、 であるが、それは次のようになる:

"Uncaught TypeError: Cannot read property 'bind' of undefined"

+1

方法、またはから 'listUpcomingEvents'が呼び出されていますか? –

+0

"listUpcomingEvents"関数をそのホストオブジェクトにバインドします。 'var someObj = {listUpcomingEvents:function(){}}; someObj.listUpcomingEvents = someObj.listUpcomingEvents.bind(someObj); ' –

+0

@GünterZöchbauerこれは、以下に示すように、Googleのサインインを意識した成功イベントによって引き起こされます:https://elements.polymer-project.org/elements/google-signin?active = google-signin-aware、いくつかのパラメータを指定するとgoogle-api:gapi.client.load( 'calendar'、 'v3'、this.listUpcomingEvents)を使用できます。 私が言うことができる限り動作します –

答えて

1

コメントで発見されたように、あなたはコンテキストをバインドせずにPolymerオブジェクトの関数を渡していた。コールバックが呼び出されたとき、コンテキストはあなたのPolymerオブジェクトではなかったので、handleResponseは見つかりませんでした。

これは、あなたが関数を渡すとき.bind(this)でコンテキストを結合することによって解決されます。

_onApiReady: function() { 
    ... 
    gapi.client.load('calendar', 'v3', this.listUpcomingEvents.bind(this)); 
} 
関連する問題