2014-11-05 63 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