2014-11-05 114 views
1

因此,我不想使用Google的JavaScript文檔中的示例粘貼標準副本&,而是使用全局變量,我想使用原型封裝所有內容。在Javascript原型中使用Google Drive API

我的功能始於此:

define(function (require){ 
    'use strict'; 
    ... 

,但在這我現在擋住了有趣的一點是:

GoogleDrive.prototype.loadAPI = function() { 
    window.gapi.load('picker', {'callback': this.onPickerApiLoad}); 
}; 

GoogleDrive.prototype.onPickerApiLoad = function() { 
    this.pickerApiLoaded = true; 
    this.createPicker(); 
}; 

這並不因爲this工作回調裏面是不是我的GoogleDrive所以我得到:

Uncaught TypeError: Cannot set property 'pickerApiLoaded' of undefined 

H我會將那個.onPickerApiLoad連接到正確的範圍嗎?

UPDATE:

通過@喬恩的回答,我看着下劃線的bind法源代碼,它使用call,所以我試圖做同樣的,與返回一個版本我的原型功能的功能提示綁定到我想要的上下文:

GoogleDrive.prototype.loadAPI = function() { 
     var that = this; 
     googleAPI.load('picker', {'callback': function() { return that.onPickerApiLoad.call(that) }}); 
    }; 

這似乎工作(不得不確認),但沒有那麼優雅。

回答

0

我終於祭出call和匿名函數,利用這我可以通過我自己的上下文︰

var that = this; 
googleAPI.load('picker', { 'callback': function() { 
    return that.onPickerApiLoad.call(that) 
} }); 
var that = this; 
googleAPI.load('picker', { 'callback': function() { 
    return that.onPickerApiLoad.call(that) 
} }); 
1

我敢打賭,你可以得到這個使用下劃線或羅短跑(一個下拉下劃線替換)的bind功能工作:

GoogleDrive.prototype.loadAPI = function() { 
    window.gapi.load('picker', {'callback': _.bind(this.onPickerApiLoad, this)}); 
}; 
+0

我注意到谷歌返回一個承諾,如果你不通過回調,是否有可能使用,而不是另一個庫? – aledalgrande 2014-11-05 00:18:45

+0

其實我錯了,只有'gapi.client.load'返回一個承諾,而且這個API是(令人困惑的)完全分離的。 – aledalgrande 2014-11-05 01:01:20

+0

啊好的。是的,如果你有承諾,你可以用諾言...... – 2014-11-05 01:38:29